自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

使用Visual Studio 2005創(chuàng)建C#項目案例

開發(fā) 后端
這是一篇使用Visual Studio 2005創(chuàng)建C#項目案例,和.NET Framework一樣,.NET Compact Framework也提供了平臺調(diào)用P/Invoke功能以支持托管代碼調(diào)用駐留于 DLL 中的非托管函數(shù)。關(guān)于.NET Compact Framework的詳細討論。

本C#項目案例主要是使用Visual Studio 2005創(chuàng)建C++和C#混合項目的方法,涉及C#智能設(shè)備項目和C++智能設(shè)備項目。

通過P/Invoke我們可以充分利用已有的非托管資源,使用非托管的系統(tǒng)API函數(shù),以彌補.NET Compact Framework的不完備性。因此我們可以使用C++來編寫非托管的DLL函數(shù),然后通過P/Invoke在C#中進行調(diào)用。vs2005提供了一個很好的集成環(huán)境,我們可以使用一個解決方案同時管理托管的C#項目和非托管的C++項目。下面介紹使用vs2005創(chuàng)建C++和C#混合項目的方法。

1、首先創(chuàng)建一個C#智能設(shè)備項目。如智能設(shè)備-Pockent PC 2003-設(shè)備應(yīng)用程序,假定解決方案名為“MixedSolution”,項目名為“DeviceApplication1”。

2、添加C++智能設(shè)備項目。在解決方案“MixedSolution”中添加一個新的項目,使用C++創(chuàng)建相同平臺(如Pockent PC 200)的智能設(shè)備Win32或MFC項目,假定項目名為“CppProject”。注意CppProject必須是Win32或MFC的DLL項目,因為我們需要使用P/Invoke功能實現(xiàn)由C#調(diào)用C++項目的DLL。在C++項目中編寫需要的函數(shù)處理后,對要導(dǎo)出的函數(shù)需要進行導(dǎo)出定義,該函數(shù)將被C#的P/Invoke調(diào)用,只有被正確導(dǎo)出的函數(shù)才能被P/Invoke識別。這里值得注意的只有使用修飾符extern “C” _declspec(dllexport)修飾的函數(shù)才能被P/Invoke調(diào)用。在該修飾符中_declspec(DLLexport)表示輸出,即導(dǎo)出函數(shù)的定義;extern “C”表示該函數(shù)使用C編譯方式,可以被C調(diào)用,P/Invoke只能調(diào)用使用這種方式編譯的函數(shù)。

我們可以定義如下符號:

  1. #define DLLAPI extern "C" __declspec(dllexport) 

定義了該符號后,可以使用它來修飾要導(dǎo)出的函數(shù),如聲明函數(shù)MyFunction:

  1. DLLAPI int MyFunction(int, int); 

聲明了該函數(shù)后,在函數(shù)的定義部分使用或不使用DLLAPI修飾都是被允許的。

  1. int MyFunction(int, int) //聲明了函數(shù)后,在定義部分可以不加修飾符  
  2. {  
  3.               int ret = 0;  
  4.               //...處理  
  5.               return ret;  

也可以只給函數(shù)定義,而省略聲明部分,這時當(dāng)然就得加上修飾:

  1. DLLAPI int MyFunction(int, int) //只給出函數(shù)定義,必須加上修飾  
  2.  {  
  3.               int ret = 0;  
  4.               //...處理  
  5.               return ret;  
  6. }  
  7.  

我們知道,DLL本身不僅可以導(dǎo)出函數(shù),還可以導(dǎo)出變量和類,但由于P/Invoke只能導(dǎo)入DLL中函數(shù)的定義,因此這里只關(guān)注函數(shù)的導(dǎo)出。

3、  使用DllImport導(dǎo)入函數(shù)定義。在C#項目 “DeviceApplication1”添加一個包裝類,使用DllImport導(dǎo)入“CppProject”項目的導(dǎo)出函數(shù)。

  1. internal class Wrapper  
  2.     {  
  3.         [DllImport("CppProject.dll")]  
  4.         internal static extern int MyFunction(int k1, int k2);  
  5.     } 

4、  修改項目配置實現(xiàn)混合編譯。前面的過程只是在一個解決方案下建立了C#項目和C++項目,這兩個項目物理上沒有進行關(guān)聯(lián),因此我們必須先編譯C++項目,生成"CppProject.dll",然后拷貝該文件到設(shè)備上,再運行C#項目時才能通過P/Invoke調(diào)用該文件中的導(dǎo)出函數(shù)。如果對C++項目進行了修改,必須重復(fù)以上過程,非常地麻煩。利用vs2005的集成管理特點,對項目配置進行一下修改,我們就可以在兩個項目建立關(guān)聯(lián)。

首先修改C++項目的輸出路徑,在項目屬性的[配置屬性]-[常規(guī)]-[輸出目錄]項下,將輸出目錄改為“$(SolutionDir)\ DeviceApplication1”,即輸出到C#項目所在目錄。然后生成一下C++項目,這時在C#項目所在目錄下會生成“CppProject.dll”文件,將該文件添加到C#項目中,并在屬性中修改[復(fù)制到輸出目錄]為“如果較新則復(fù)制”。最后在解決方案的項目依賴項中,設(shè)置項目“DeviceApplication1”依賴于項目“CppProject”。

通過這樣的配置,在啟動項目的調(diào)試(F5)時,會先生成C++項目,即輸出“CppProject.dll”文件到C#項目所在目錄,然后再生成C#項目。在生成C#項目的過程中,會檢查CppProject.dll是否被更新,如果被更新,則部署到設(shè)備上。這樣修改了C++項目后同樣可以執(zhí)行啟動調(diào)試來進行整體調(diào)試,不需要再手動去單獨編譯C++項目,以及復(fù)制DLL文件了。

5、  C++DLL項目的調(diào)試。vs2005提供了多種調(diào)試模式,可以使用本機EXE程序來對DLL進行調(diào)試,也可以使用托管 EXE 中對DLL進行調(diào)試。這里的DLL項目最終是要被托管C#調(diào)用的,因此我們使用由托管C#項目創(chuàng)建的托管 EXE來對C++項目DLL進行調(diào)試。

首先設(shè)置C++DLL項目為啟動項目,并將其項目屬性的[配置屬性]-[調(diào)試]-[遠程可執(zhí)行文件]項改為C#項目輸出的EXE程序名,如%CSIDL_PROGRAM_FILES%\MixedSolution\DeviceApplication1.exe,注意該EXE文件是在設(shè)備上的路徑而不是在本機的路徑。該EXE程序名是由C#項目的[輸出文件夾] + [程序集名稱]確定。

按照以上創(chuàng)建智能設(shè)備的C++和C#混合項目的方法,我創(chuàng)建了一個混合項目應(yīng)用,為C#應(yīng)用程序增加等待光標(biāo)(等待動畫)的功能,以向用戶表明程序正在處理,如下圖:

設(shè)置等待光標(biāo)可以使用Windows CE的API函數(shù)SetCursor(LoadCursor(NULL, IDC_WAIT));但實際上IDC_WAIT是一個宏,在展開后等于(LPWSTR)((DWORD)((WORD)(32514))),因此IDC_WAIT是無法直接在C#下使用的,因而要在C#下直接使用這個API函數(shù)是非常困難的任務(wù)。而通過一個DLL項目間接的使用這條API則非常方便。DLL項目向外導(dǎo)出函數(shù)SetWaitCursor,這個函數(shù)不使用任何參數(shù),可以方便被導(dǎo)入到C#中。這個函數(shù)的定義如下:

  1. void SetWaitCursor(void)  
  2. {  
  3.        hCursor = SetCursor(LoadCursor(NULL, IDC_WAIT));  

相應(yīng)的C#的導(dǎo)入定義如下:

  1. internal class Wrapper  
  2. {  
  3.         [DllImport("W32DLL.dll")]  
  4.         internal static extern void SetWaitCursor();  

當(dāng)然,我們還需要一個恢復(fù)光標(biāo)狀態(tài)的函數(shù),也使用這種方式進行定義。這里給出全部源碼,有興趣的朋友可以下載。代碼在vs2005+ppc2003模擬器下調(diào)試通過。

【編輯推薦】

  1. C#字符串操作步驟
  2. C#集成開發(fā)環(huán)境淺析
  3. Visual C# .NET應(yīng)用程序
  4. C# TimeLabel控件詳解
  5. C#復(fù)合控件開發(fā)技術(shù)
責(zé)任編輯:彭凡 來源: 博客園
相關(guān)推薦

2009-12-04 14:40:43

Visual Stud

2009-12-16 15:53:34

Visual Stud

2009-12-03 10:04:50

Visual Stud

2010-09-28 08:52:00

C#Visual Stud

2011-06-09 15:47:01

Qt Visual Stu

2009-12-03 10:38:29

Visual Stud

2009-12-03 15:58:33

Visual Stud

2009-08-20 11:03:34

Visual C#使用

2009-09-02 16:21:17

Visual BasiC#語言

2009-12-04 10:35:56

Visual Stud

2010-04-07 13:13:19

Visual Stud

2009-11-24 15:44:26

Visual Stud

2023-10-12 08:41:36

C# 開發(fā)工具

2009-08-07 10:53:59

Visual C#Excel

2009-12-09 14:29:11

Visual Stud

2009-11-05 15:43:02

Visual Stud

2009-12-09 16:12:49

Visual Stud

2009-12-04 16:57:52

Visual Stud

2009-12-04 11:17:00

Visual Stud

2009-12-11 09:42:00

Visual Stud
點贊
收藏

51CTO技術(shù)棧公眾號