C 呼叫C型別dll入參為struct的問題詳解

2022-09-26 01:21:08 字數 2435 閱讀 3060

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...