1. 程式人生 > >C#調用非托管C++DLL的兩種方法

C#調用非托管C++DLL的兩種方法

sso tro medium direction ive 之間 測試工程 win bug

C#編寫的代碼屬於跨平臺的托管代碼,C++語言可以編寫托管(managed)和非托管(native)代碼。在C#C++的混合編程中,經常會使用C#來調用native C++DLL,下面有兩種常用的調用方法供大家參考。

  1. 使用P/Invoke直接調用native C++ Dll裏面的函數。(註:此方法只能調用函數,不能調用class)。

  2. C#通過C++ CLR(托管的C++)來調用nativeC++ DLL C++ CLR作為鏈接C#native之間的紐帶。

方法一的詳細過程如下:

  1. 1)打開VS2015,新建C++ win32項目,過程如下圖:

技術分享

技術分享

技術分享

2)然後添加

nativeCPP.hnativeCPP.cpp連個文件,分別編寫代碼,如下圖:

NativeCPP.h :

技術分享

nativeCPP.cpp : (函數實現)

技術分享

  1. 在工程中再添加nativeCPP.def文件:

技術分享

文件內容:

技術分享

4)在解決方案中添加C#應用控制臺工程,

技術分享

並設置為開始啟動項目(鼠標移到ConsoleApplication_test項目上右擊):

技術分享

Program.cs文件內容如下:

技術分享

技術分享

編譯運行的結果如下:

技術分享

二、方法二的詳細過程如下:

(1)新建C++ win 32項目

技術分享

技術分享

(2)項目中新建nativeCPP.h nativeCPP.cpp文件,文件內容如圖:

技術分享

技術分享

(3)在解決方案中添加新的類庫工程項目:

技術分享

然後在CLRWrapper的項目中引用nativeCPP項目:

技術分享

然後在CLRWrapper.h CLRWrapper.cpp文件中分別添加如下內容:

技術分享

技術分享

(4)在解決放在中添加C#的測試工程ConsoleApplication_test,並設置為開始啟動項。

技術分享

然後在C#測試工程中添加對CLRWrapper的引用,並在Program.cs文件裏面添加如下代碼:

技術分享

編譯通過,運行,會出現如下的情況:

技術分享

這個是因為C#執行文件無法直接引用CLRWrapper的依賴項nativeCPP,所以這個時候需要手動把nativeCPP

項目生產的nativeCPP.dllnativeCPP.pdb兩個文件拷貝到C#工程的bin下面的Debug文件裏面(也可以在VS2015環境裏面設置自動復制,詳細過程請看http://www.cnblogs.com/qiushui127/p/7147229.html)。然後運行結果如下:

技術分享

END!!!!

C#調用非托管C++DLL的兩種方法