c# 可以通過 dllimport 的方式引用 c 型別的 dll。但很多 dll 的引數不會是簡單的基礎型別,而是結構體 struct 。因此就需要在 c# 端定義同樣的結構體型別,才能實現呼叫 c 型別 dll。這裡例舉幾種不同的結構體情況,以及其對應的解決方案。
對於乙個結構體型別:
typedef struct data
;在 c# 端就需要定義為
[structlayout(layoutkind.sequential)]
public struct data
對於乙個包含字元陣列的結構體型別:
typedef struct data
;在 c# 端就需要使用 marshal 設定資料空間大小,同時最好定程式設計客棧義乙個初始化函式與 get 的定義
[structlayout(layoutkind.sequential)]
public struct data
string sstring
return sdata;
}} public int nnumber;
public float fdecimal;
[marshalas(unmanagedtype.byvalarray, sizeconst = 256)]
char szstring;
}對於乙個包含字元二維陣列的結構體型別:
typedef struct data
;在 cysejcphds# 端同樣需要使用 marshal 設定資料空間大小,需要將兩個 size 相乘,並定義乙個初始化函式。同時在做乙個 get 的定義。
[structlayout(layoutkind.sequential)]
public struct data
public string sstrings
sdatas[i] = sdata;
}return sdatas;
}} public int nnumber;
public float fdecimal;
[marshalas(unmanagedtype.byvalarray, sizeconst = 256 * 6)]
char szstrings;
}若有乙個這樣的 c dll 函式定義:
void fncall(data* datas);
// 呼叫方式
data datas[10];
fncall(datas);
那麼,在 c# 中要實現等價呼叫:
// 首先 import 函式
[dllimport("module.dll")]
public static extern void fncall(intptr pinfo); // 注意入參要定義為指標
// 再定義定義結構體陣列
int ncount = 10;
data datas = new data[ncount];
// 再分配記憶體空間
int nsize = marshal.sizeof(typeof(device_info));
intptr dataptr = marshal.allochglobal(nsize * ncount);
// 呼叫函式
fncall(dataptr);
// 複製資料到結構體中
for (int i = 0; i < ncount; i++)
// 釋放記憶體空間
marshal.freehglobal(dataptr);
另外,如果你要呼叫的 dll 是非 c 型別 dll,而是 c++ class。那麼我們就可以將其再包裝一層,轉換為 c 型別 dll。
例如:class example ;
那麼就可以編寫 c 型別的 dll。
extern "c"
int example_methodcall(example* p)
void example_delete(example* p)
}c# 那邊就這樣匯入
[dllimport("module.dll")]
public static extern intptr example_create();
[dllimport("module.dll")]
public static extern int example_methodcall(intptr value);
[dllimport("module.dll")]
public static extern void example_delete(intptr value);
// 呼叫方式
intptr p = example_create();
example_methodcall(p);
example_delete(p);
至於 c 型別 dll 中其他型別變數在 c# 的對應,則可以參考 microsoft 的 文件 。
c 呼叫c語言dll,形參有char
c 呼叫c語言dll,形參有char 無法獲得char 內容。但是在c 中呼叫dll無問題。說明dll正確,c 中 有問題。直接解決方法 未解決,dll沒問題,就是呼叫後儲存在webtoken中讀取有問題,求大神告知解決方法 變相解決方法 修改dll檔案,將形參char 作為返回值char 返回。原...
c 呼叫dll型別對應表
c 呼叫dll 檔案時引數對應表 wtypes.h 中的非託管型別 非託管 c 語言型別 託管類名 說明 handle void system.intptr 32 位 byte unsigned char system.byte 8 位short short system.int16 16 位 wo...
DWR呼叫入參為Map的方法
在頁面中通過dwr技術呼叫入參為map的後台方法時,只需要在頁面中定義如下格式的函式就可以了 var mapit 我頁面的實現 var bigclassselect document.getelementbyid imtypeid var bigclassvalue bigclassselect.o...