C 呼叫C 的DLL入門篇

2021-05-27 16:06:48 字數 1674 閱讀 4321

首先,問什麼會出現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 ...