C#編寫的代碼屬於跨平臺的托管代碼,C++語言可以編寫托管(managed)和非托管(native)代碼。在C#與C++的混合編程中,經常會使用C#來調用native C++的DLL,下麵有兩種常用的調用方法供大家參考。 使用P/Invoke直接調用native C++ Dll裡面的函數。(註:此方 ...
C#編寫的代碼屬於跨平臺的托管代碼,C++語言可以編寫托管(managed)和非托管(native)代碼。在C#與C++的混合編程中,經常會使用C#來調用native C++的DLL,下麵有兩種常用的調用方法供大家參考。
-
使用P/Invoke直接調用native C++ Dll裡面的函數。(註:此方法只能調用函數,不能調用class)。
-
C#通過C++ CLR(托管的C++)來調用nativeC++ DLL, C++ CLR作為鏈接C#與native之間的紐帶。
方法一的詳細過程如下:
-
(1)打開VS2015,新建C++ win32項目,過程如下圖:
(2)然後添加nativeCPP.h和nativeCPP.cpp連個文件,分別編寫代碼,如下圖:
NativeCPP.h :
nativeCPP.cpp : (函數實現)
-
在工程中再添加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.dll和nativeCPP.pdb兩個文件拷貝到C#工程的bin下麵的Debug文件裡面(也可以在VS2015環境裡面設置自動複製,詳細過程請看http://www.cnblogs.com/qiushui127/p/7147229.html)。然後運行結果如下:
END!!!!