C 中呼叫C 寫的DLL注意事項

2021-06-06 16:07:41 字數 1263 閱讀 9617

c#中呼叫c++寫的dll

最近在寫畢業設計,硬體模組兒的功能都封裝到dll裡面了,當初想c#呼叫dll也不一樣easy(c#就看了一天就開始做了),可是等到該使用的時候發現了問題,結構體...就是這個,因為要傳遞結構體陣列,結果死活是搞不定,只是能得到一組資料。試了網上的很多方案,包括intptr這些,可是仍不行,就這樣折騰了三四天,其實這三四天裡面一直想把結構體單獨拿出來,做demo測試可一直存著僥倖心理,沒下手做。今天實在是受不了就安心做,把結構體的成員逐漸增加,這樣試,嘿嘿,最終還是給讓我發現了問題,md,有個小結構體的位元組沒對齊。對齊之後就ok了,demo上能跑了。

1.如果c++生成的dll需要被c#呼叫,那麼在c++的結構體中,字串應用char(wchar)型別,避免使用stirng,cstring,在c#中宣告這個結構的時候,對應的使用string型別但是必須指明string的長度。

2.如果被呼叫的函式中需要傳遞結構體指標,在c#中宣告函式的時候加上out或者ref標誌,如果要傳遞的是結構體陣列,在這種情況下,如果結構體中並不包含其他的結構體或者包含的結構體的位元組是對齊的,那麼宣告函式的時候加上[in,out]即可。

如果被包含的結構體位元組是未對齊的就無法得到正確結果。(位元組對齊的可g.cn)

補充下關於字串操作的:

3.如果需要從dll中返回單個字串,用如下呼叫方式

c#:[dllimport("pinvokedll.dll", setlasterror = true , charset=charset.unicode)]

public static extern void strtest1([in,out]char str);

dll:

void strtest1(wchar* str);

4.如果需要從dll中返回字串陣列,用如下呼叫方式(暫時想到用結構體封裝的方式)

c#:[structlayout(layoutkind.sequential, charset = charset.unicode)]

public struct struct4

;[dllimport("pinvokedll.dll", setlasterror = true , charset=charset.unicode)]

public static extern void strtest2([in,out]struct4 str , int len);

dll:

struct struct4

;void strtest2(struct struct4* str , int len);

文獻**於:

C 除錯DLL庫注意事項

正常情況下將兩個工程新增到乙個解決方案中,乙個是生成dll庫的工程,乙個負責呼叫如下圖所示 靜態呼叫時需要匯出dll庫中的函式 ifndef sm7 dll h define sm7 dll h extern c endif 然後在呼叫檔案中載入lib庫 include stdafx.h inclu...

C 除錯DLL庫注意事項

正常情況下將兩個工程新增到乙個解決方案中,乙個是生成dll庫的工程,乙個負責呼叫如下圖所示 靜態呼叫時需要匯出dll庫中的函式 ifndef sm7 dll h define sm7 dll h extern c endif 然後在呼叫檔案中載入lib庫 include stdafx.h inclu...

c 動態庫呼叫注意事項

ifdef msc ver include include define get function address x,y getprocaddress x,y define load dynamic library x loadlibrary x define free dynamic libra...