說來慚愧,都注冊一年多了,卻沒有發(fā)表過一篇正式的博文,中間很多學(xué)習(xí)的過程也沒有記錄下來。如今到了一個新的環(huán)境,也有了學(xué)習(xí)的機(jī)會,一定要把每天的收獲記錄一下。
要做的東西需要引用C++編寫的DLL,剛開始從網(wǎng)上看到覺得挺麻煩的就沒有仔細(xì)研究,如今看到別人寫的文章,感覺也不是多難。下面分享一下:
1、整一個DLL
使用C++創(chuàng)建一個動態(tài)庫項目,應(yīng)用程序設(shè)置中選擇“DLL”
打開CPPDemo.cpp文件,添加如下代碼
#include "stdafx.h"extern "C" __declspec(dllexport) int Add(int x, int y) { return x + y; }extern "C" __declspec(dllexport) int Sub(int x, int y) { return x - y; }extern "C" __declspec(dllexport) int Multiply(int x, int y) { return x * y; }extern "C" __declspec(dllexport) int Divide(int x, int y) { return x / y; }
在這里面:extern "C" 包含雙重含義,從字面上即可得到:首先,被它修飾的目標(biāo)是“extern”的(extern可以置于變量或者函數(shù)前,以表示變量或者函數(shù)的定義在別的文件中,提示編譯器遇到此變量和函數(shù)時在其他模塊中尋找其定義。);其次,被它修飾的目標(biāo)是“C”的。而被extern "C"修飾的變量和函數(shù)是按照C語言方式編譯和連接的。
__declspec(dllexport)的目的是為了將對應(yīng)的函數(shù)放入到DLL動態(tài)庫中。
extern "C" __declspec(dllexport)加起來的目的是為了使用DllImport調(diào)用非托管C++的DLL文件。因為使用DllImport只能調(diào)用由C語言函數(shù)做成的DLL。
編譯項目,得到CPPDemo.dll
2、使用C#調(diào)用這個DLL
創(chuàng)建一個C#項目,新建一個CPPDLL類,在類中添加如下代碼,就是把要用到的方法重新聲明了一下,具體實現(xiàn)代碼不用寫了。
public class CPPDLL { [DllImport("CSharpInvokeCPP.CPPDemo.dll")] public static extern int Add(int x, int y); [DllImport("CSharpInvokeCPP.CPPDemo.dll")] public static extern int Sub(int x, int y); [DllImport("CSharpInvokeCPP.CPPDemo.dll")] public static extern int Multiply(int x, int y); [DllImport("CSharpInvokeCPP.CPPDemo.dll")] public static extern int Divide(int x, int y); }注意1記得要使用DllImport,要引用“System.Runtime.InteropServices”,2、把CPPDemo中生成的DLL文件拷貝到CSharpDemo的bin目錄下
這樣在項目中就可以使用DLL的方法了。
int result = CPPDLL.Add(10, 20);
這只是通過靜態(tài)方法調(diào)用C++里面的函數(shù),對我來說也足夠了。暫時就寫這些,堅持就是勝利。里面的代碼參考了其他人的成果,沒有找到作者也不方便說。只想說網(wǎng)絡(luò)上大家都分享才能進(jìn)步,如果我寫的能幫到你我很高興。如果你有好的意見,歡迎反饋。
新聞熱點
疑難解答