首先,問什麼會出現c#程式呼叫c++編寫的dll檔案呢?下面簡單描述一下這種情況的背景。在新開發的專案中使用的新語言c#和新的技術方案webservice,
但是在新專案中,一些舊的模組仍需要使用,一般採用c、c++或delphi編寫,如何利用舊模組對與開發人員有三種方法可選擇:
徹底改寫,你懂得,c++中的指標和記憶體的操作,改寫成c#是一件非常頭疼事。
將c或c++函式封裝成com,在c#中呼叫com,還是比較方便。只需要做一些資料型別的轉化,但是com需要註冊啊,多次註冊多造成混亂的,也著實頭疼。
將c或c++函式封裝成dll, 封裝過程簡單,工作量也比較小。c#呼叫c++或c的dll,注意兩個問題:a,資料型別轉化。b,對指標和記憶體的轉化。這兩點還是比較容易解決的。
技術實現
建立乙個testdll的專案,專案型別是classlibrary。
testdll.cpp檔案中新增如下**。
#include using namespace std;
int myadd(int a,int b)
char* mychar(char* a,char** b)
testdll.h檔案新增如下**。
#ifdef import
#define import extern "c" _declspec(dllimport)
#else
#define import extern "c" _declspec(dllexport)
#endif
import int myadd(int a,int b);
import char * mychar(char* a,char* b);
新增乙個檔案def的檔案,命名為testdll.def。新增如下**。
library "testdll"
exports
myadd @1
mychar @2
進行編譯,生成相應的dll和lib檔案。
在class program中匯入testdll中的函式,匯入**如下。
[dllimport("testdll.dll", entrypoint = "myadd", charset = charset.unicode, callingconvention = callingconvention.stdcall)]
public static extern int myadd(int a, int b);
[dllimport("testdll.dll", entrypoint = "mychar", charset = charset.ansi, callingconvention = callingconvention.stdcall )]
public static extern string mychar(string a, ref string b);//注意與c++函式的資料型別的轉化
測試**:
int c = myadd(1, 3);
console.writeline("1+3=" + c);
trycatch (exception ex)
console.read();
以上完成了c#程式呼叫c++的dll檔案。
C語言入門篇
目錄 1 字面意思是啥就是啥,看其表示就可以知道其值和類www.cppcns.com型。2 有值無名,一用來初始化變數,與一種字元相關聯。www.cppcns.com include int main 1 常變數 c語言中,把用const修飾的變數稱為常變數。2 常變數具有常量屬性,不可被直接修改 ...
C語言入門篇
目錄 加 減 乘 除 取模 除法運算分母不可為零,否則程式會中斷報錯,所以要在程式中檢驗分母是否為零。取模即取餘數。右移 左移 1.移位運算是站在二進位制角度移位的 eg include int main 2.左移右移,原始變數值不發生變化除非給原始變數賦值 3.整數移位運算不能整除時,只保留整數部...
C語言入門篇
目錄 ststic修飾區域性變數,會改變區域性變數的生命週期,不改變作用域 生命週期 和全域性變數一樣具有全域性性,但在記憶體中的位置沒有改變,還在在靜態儲存區中。作用域 作用域不改變。注意 靜態區域性變數的初始化在整個變數定義時只會進行一次。1 不加static include show int ...