關於C 呼叫C DLL庫傳入陣列 引用的記錄。

2021-10-23 10:08:01 字數 1721 閱讀 8564

1、複雜型別需要c#在定義時保持和c++中的源型別一模一樣,特別是成員的順序,一定要一致。

2、複雜型別中的陣列在長度固定時,使用[marshalas(unmanagedtype.byvalarray, sizeconst=length)]

如:

[

marshalas

(unmanagedtype.byvalarray, sizeconst =

65535)]

public

int[

] vectordata =

newint

[65535

];

,長度不固定時,該成員需要定義為intptr型別的通用指標,如:

public

intptr fc;

3、c++中以type* 定義的成員在c#中,除了 char* 可以用 c#的string對應外,其他都應考慮 intptr 和 marshl.alloc/freecotaskmem。

4、呼叫函式時需要傳入的陣列引數可以直接使用c#的陣列(陣列型別一致),如:

double

iqbuffer =

newdouble

[iqpairs *2]

;sgenerator.

dll_get_askiq(0

, iqbuffer, iqpairs,1)

;

5、複雜型別中的intptr在賦值時應如下:

注:c++中長度不固定的指向型陣列指標都應有乙個對應的int型別的長度變數才對。

如:

public

intptr fc;

public

int fc_num;

//fc的長度

賦值時:

int size =6;

int fc=

newint

[size]

;intptr fcbuffer = marshal.

alloccotaskmem

(marshal.

sizeof

(fc[0]

)* size)

;marshal.

copy

(fc,

0, fcbuffer, fc.length)

;sp.fc = fcbuffer;

sp.fc_num = size;

6、引用型別在c#中宣告函式的時候應加ref,c++中的type*型別的引數應使用[in,out],如:

[

dllimport

(dllname)

]public

static

extern

intdll_createcontext([

in,out]

spara sp,

refint length);[

dllimport

(dllname)

]internal

static

extern

void

dll_get_askiq

(int id,[in

, out]

double

data,

int len,

int fr)

;

更多關於封送處理不同型別的陣列→傳送門

怎麼使用C 呼叫C dll 類庫

今天公司有需要與第三方的硬體廠商進行對接,一般硬體廠商提供的大多為c dll 這就涉及到c 呼叫c 了,首先我們需要看一下c dll 裡面定義的是什麼方法,包括傳遞的引數 dll 檔案不便上傳下面舉例說明是怎麼實現的 例如c 方法是這樣定義的 int stdcall unpackdatafile c...

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

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

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

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