C 呼叫C dll 結構體引數傳遞問題

2021-06-07 21:25:31 字數 2078 閱讀 3511

1、最近做專案遇到,c#呼叫c++dll裡的函式需要傳遞結構體引數,發現這個並不是簡單的在c#裡定義相應的結構體就可以的,下面以乙個例子來說明解決的辦法,c++中的函式和結構體如下:

uint msec_set_igr_gen_cfg(int port, igr_gen_t *igr_gen)

typedef struct igr_gen_t;

在c#中 首先需要使用dllimport將相應的c++dll load進來,然後定義相應的結構體,具體如下:

[dllimport("..\\debug\\mgd_macsec.dll")]

private static extern uint32 msec_set_igr_gen_cfg(int port, intptr igr_gen);

結構體定義:

[structlayout(layoutkind.sequential)]

public class igr_gen_t 

} ;

在**中具體引用函式時如下所示,

intptr ptr = marshal.allochglobal(marshal.sizeof(igr_gen));

marshal.structuretoptr(igr_gen, ptr, false);

uint32 ret = _msec_set_igr_gen_cfg(port, ptr);

igr_gen = (igr_gen_t)marshal.ptrtostructure(ptr, typeof(igr_gen_t));

marshal.freehglobal(ptr);

return ret;

從以上步驟可以看出,結構體引數的傳遞需要marshal做輔助做相應的轉化,以intptr的方式傳輸結構體引數。

2、還存在另外一種情況,是結構體中巢狀有結構體時需要做一些特殊處理,具體如下:

結構體typedef struct act_fld;

typedef struct lkup_t;

c++ 函式

uint  msec_port_set_egr_entry (in int port, in int ent_num, in lkup_t *egr_lkup)

c#在呼叫時首先將相應dll import進來,進行相應結構體的定義和相應函式的宣告,具體如下:

[dllimport("..\\debug\\mgd_macsec.dll")]

private static extern uint32 msec_set_igr_gen_cfg(int port, intptr igr_gen);

[structlayout(layoutkind.sequential)]

public class act_fld 

} [structlayout(layoutkind.sequential)]

public class lkup_t

} 具體在**中引用時如下所示:

intptr egr_lkup_ptr = marshal.allochglobal(marshal.sizeof(egr_lkup));

marshal.structuretoptr(egr_lkup, egr_lkup_ptr, false);

uint ret = _msec_port_set_egr_entry(port, ent_num, egr_lkup_ptr);

egr_lkup = (lkup_t)marshal.ptrtostructure(egr_lkup_ptr, typeof(lkup_t));

marshal.freehglobal(egr_lkup_ptr);

另外列舉(enum)引數傳遞時類似於int型,只需在c#裡定義相應的列舉提即可,不需做相應轉化,在此不再給出具體方法。

另,c++ dll要想被c#所使用,需要進行設定,支援通用語言,具體如下圖所示:(common language runtime support選項)

C 呼叫C dll中的結構體的定義

為使用者定義的結構指定自定義封送處理 可以為傳遞到非託管函式或從非託管函式返回的結構和類的字段指定自定義封送處理屬性。通過向結構或類的字段中新增 marshalas屬性可以做到這一點。還必須使用 structlayout 屬性設定結構的布局,還可以控制字串成員的預設封送處理,並設定預設封裝大小。示例...

C 呼叫c Dll結構體陣列指標的問題

c 呼叫c dll檔案是一件很麻煩的事情,首先面臨的是資料型別轉換的問題,相信經常做c 開發的都和我一樣把學校的那點c 底子都忘光了吧 語言特性類 網上有一大堆得轉換對應表,也有一大堆的轉換例項,但是都沒有強調乙個更重要的問題,就是c 資料型別和c 資料型別佔記憶體長度的對應關係。如果dll檔案中只...

C 呼叫c Dll結構體陣列指標的問題

c 呼叫c dll檔案是一件很麻煩的事情,首先面臨的是資料型別轉換的問題,相信經常做c 開發的都和我一樣把學校的那點c 底子都忘光了吧 語言特性類 網上有一大堆得轉換對應表,也有一大堆的轉換例項,但是都沒有強調乙個更重要的問題,就是c 資料型別和c 資料型別佔記憶體長度的對應關係。如果dll檔案中只...