C 中使用DllImport呼叫C dll

2021-05-11 11:13:23 字數 861 閱讀 1470

為什麼要在c#中呼叫c++的**呢?比如我有乙個c#專案要實現某種功能,同時我恰好有乙個已經實現了這個功能的c++**。我可以用c#重寫一遍,當然如果工程比較大的話,用dllimport來呼叫c++的dll是乙個更好的選擇。

由於c++dll是非託管**,我不能直接在c#工程中新增引用(會出錯誤提示)。命名空間system.runtime.interopservices提供了dllimport attribute來動態載入非託管dll。

示例一:

c#[dllimport("d:/unitysocket.dll", entrypoint="unity_connect")]

public static extern bool unity_connect(string ip, string port);

c++extern c

看起來很簡單,不過複雜的地方其實在於c#與c++的型別對應。比如說:c++中字元陣列是要以'/0'結尾的,c#中的string可沒有結束符。這在有**函式(c++中宣告callback,c#中定義delegate具體函式。c++中會使用這個具體的函式)的情況時要尤其注意。

特別的,intptr。一般來說c++中的指標就對應c#中的intptr,例外情況就是char*可以對應c#中的string。但是安全的方法,就應該是對應intptr,然後使用marshal類中的一籮筐靜態方法來轉換成c#中的具體型別。命名空間都是system.runtime.interopservices。

在看上面**的時候有沒有人注意到dllimport是用絕對路徑寫的,是否可以用相對路徑呢。我查的結果,是不行滴~但是內建(找不到合適的詞彙形容)dll可以,比如windows的kernel.dll。有以下幾種方法(網上查的):

(待續,明天直接拷文字和**上來)

C 呼叫DLL中 DllImport屬性詳解(一)

現在是更深入地進行 的時候了。在對託管 進行 p invoke 呼叫時,dllimportattribute 型別扮演著重要的角色。dllimportattribute 的主要作用是給 clr 指示哪個 dll 匯出您想要呼叫的函式。相關 dll 的名稱被作為乙個建構函式引數傳遞給 dllimpor...

C 呼叫DLL中 DllImport屬性詳解(二)

現在是更深入地進行 的時候了。在對託管 進行 p invoke 呼叫時,dllimportattribute 型別扮演著重要的角色。dllimportattribute 的主要作用是給 clr 指示哪個 dll 匯出您想要呼叫的函式。相關 dll 的名稱被作為乙個建構函式引數傳遞給 dllimpor...

c 通過dllimport 呼叫c 動態鏈結庫

這篇檔案很詳細 講述了如何建立c 動態鏈結庫專案 有一些注意的地方 不做介紹 下面是.c檔案裡的 片段,注意不是.cpp cpp是c 檔案的字尾 structxy extern declspec dllexport struct xy getcoordinate int a,int b,int c,...