C 中呼叫C 編寫的Dll

2021-07-28 18:24:04 字數 2600 閱讀 2270

在vs2013中建立乙個win32控制台專案,單擊下一步,然後選擇dll。

生成的工程目錄結構為:

在自動生成的檔案中,dllmain.cpp

作為定義dll應用程式的入口點,它的作用跟exe檔案有個main或者winmain入口函式是一樣的。可以在目標cpp檔案(dllcxj.cpp)中編寫自己要實現的函式。

在c#中新建乙個類(cppdll.cs),引用對應的dll:

注意:需要在程式宣告中使用system.runtime.interopservices命名空間。

dllimport

作為c#中對c++的dll類的匯入入口特徵,只能放置在方法宣告上,並通過static extern對extern 「c」進行對應。在需要的地方呼叫.dll中的函式:直接使用類呼叫靜態方法,如:string s = cppdll.getstring();

extern "c" __declspec(dllexport) int__stdcall add(int x, int y)

extern 」c」:

通常來說,c++編譯器可能會改變函式和變數的名字,從而導致嚴重的鏈結程式問題。例如,假設使用c++編寫乙個dll,當建立dll時,microsoft的編譯器就會改變函式的名字。函式名將被設定乙個前導下劃線,再加上乙個@符號的字首,後隨乙個數字,表示作為引數傳遞給函式的位元組數。例如,下面的函式是作為dll的輸出節中的_myfunc@8輸出的:

__declspec(dllexport)long

__stdcallmyfunc(int

a,int

b);

如果用另乙個**商的工具建立了乙個可執行模組,它將設法鏈結到乙個名叫myfunc的函式,該函式在microsoft編譯器已有的dll中並不存在,因此鏈結將失敗。使用extern 「c」關鍵字可以使編譯器按照c語言的方式編譯dll檔案,即編譯時不改變函式名。

__declspec(dllexport):

__declspec(dllexport)的目的是為了將對應的函式放入到dll動態庫中。在 32位編譯器版本中,可以使用__declspec(dllexport) 關鍵字從dll匯出數、函式、類或類成員函式,__declspec(dllexport) 會將匯出指令新增到物件檔案中,因此不需要使用.def檔案。若要匯出函式,__declspec(dllexport) 關鍵字必須出現在呼叫約定關鍵字的左邊(如果指定了關鍵字)。

__stdcall:表明被呼叫方清理堆疊。

using system.runtime.interopservices;

system.runtime.interopservices命名空間提供各種各樣支援 com interop 及平台呼叫服務的成員,使程式可以與非託管**進行互動操作。

[dllimport("dllfilepath")]

**中dllimport關鍵字作用是告訴編譯器入口點在**,並將打包函式**在這個類中。dllimportattribute 屬性包括:

dllfilepath:d

llfilepath

要求寫為靜態常量,因此不方便使用表示式表示dll的路徑,而直接寫dll的絕對路徑又不方便程式的移植。推薦直接寫dll的名稱加字尾名,如:"xx.dll"。

dllimport

會按照順序自動去尋找的地方: 1

、exe所在目錄 2、system32目錄 3、環境變數目錄。所以只需要把引用的dll 拷貝到上述任意乙個目錄下即可。 不用寫.dll絕對路徑。

entrypoint="messageboxa"使用entrypoint屬性設定函式名

charset 指示用在入口點中的字符集,如:charset=charset.ansi;

exactspelling 指示 entrypoint 是否必須與指示的入口點的拼寫完全匹配,如:exactspelling=false;

preservesig指示方法的簽名應當被保留還是被轉換,如:preservesig=true;

callingconvention指示入口點的呼叫約定,如:callingconvention=callingconvention.winapi;

建議增加特性 

callingconvention=callingconvention.cdecl,不然可能會出現 「堆疊不對稱」錯誤。

必須在標記為」static」

和」extern」的方法上指定」dllimport」屬性,每乙個方法前面都需要新增dllimport。

C 呼叫C 編寫的dll

介面還是c 寫的方便點,主要是有乙個視覺化的編輯器,不想畫太多的時間在介面上。但是自己又對c 了解的多一些,所以在需要乙個良好的介面的情況下,使用c 來寫 邏輯,將其編譯成乙個dll,然後用c 寫介面,extern c declspec dllexport int testadd int a,int...

C 中如何呼叫C 編寫的DLL

csdn c 經過這麼多年的發展已經積累了大量的動態連線庫,如果能夠在.環境裡應用這些函式庫,可以很大的提高整個應用的開發速度。使用c 程式設計的人員肯定對指標不會感到陌生,由於c 中的函式介面好多都可能定義成位指標,而c 中只有在宣告為unsafe code中才能夠使用指標。如果想讓c 的dll支...

MFC中呼叫C 編寫的DLL

一 使用 clr 編譯 mfc 可執行檔案或規則 dll 1 開啟 專案屬性 對話方塊,方法是右鍵單擊 解決方案資源管理器 中的專案並選擇 屬性 2 展開 配置屬性 旁邊的節點並選擇 常規 在右側窗格中的 專案預設值 下,將 公共語言執行庫支援 設定為 公共語言執行庫支援 clr 3 在相同的窗格中...