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檔案中只...