1.使用c++編寫乙個動態庫(dll);
2.將dll內函式匯出;
3.使用c#進行呼叫;
4.方法呼叫;
5.在vs進行除錯;
1.1建立專案(x64);
在vs2017中新建->專案->visual c++->windows桌面->動態鏈結庫;
在專案屬性中->常規中選擇無公共語言支援,即不建立託管c++類庫;
1.2新增類和方法;
在該類的.cpp檔案中宣告方法;
自定義乙個結構體
在方法的引數中使用結構體,
方法種類:
a類: int testfunc(int a);
b類:int funci2(char * c);
c類:char * funcc(int a);
d類:char funcc2();
e類: int getmyintrostruct(myintrostruct* mystr, int* c);
f類:int setmyintrostruct(myintrostruct mystr, int index);
1.3 將方法匯出;
這裡使用extern "c" __declspec(dllexport)標記方法的方式進行匯出;
也可以使用.def檔案進行匯出;
;.def檔案的規則; (
1)library語句說明.def檔案相應的dll
; (
2)exports語句後列出要匯出函式的名稱。可以在.def檔案中的匯出函式名後加@n,表示要匯出函式的序號為n(在進行函式呼叫時,這個序號將發揮其作用)
; (
3).def 檔案中的注釋由每個注釋行開始處的分號 (;) 指定,且注釋不能與語句共享一行
;helloworld.dll : 匯出dll函
這裡採用dllimport特性標記方式進行匯入
這裡需要注意型別得對應問題:
引數:
c++字串(char *)->c# string
c++字串(char *)->c# intptr
c++結構體->c# intptr
結構體指標->c# intptr
整形指標->c# ref int
在c#類中新增相應結構的自定義結構體(注意結構體的順序),指定結構的記憶體分布為順序分布;
對於引數傳入型別:
a類,b類方法,可以直接呼叫;
對於inptr引數的方法,可以在c#內申請記憶體空間傳入c++中進行賦值,並需要對指標釋放;(這裡有自定義的c++函式預先提供相關函式的輸出陣列大小)
對於傳出的引數intptr型別的可以進行資料讀取,將intptr轉換為string型別:
對於自定義結構體的intptr指標可以通過對指標偏移獲取資料:
在同乙個vs工程中,使用單步除錯可以從c#呼叫**逐步除錯到c++被呼叫**中
C 呼叫C 類庫2
前文 為了測試c 呼叫的c 類庫需要呼叫其他c 類庫的情況 也不知道是不是應該這樣形容,如下圖,目的是呼叫cameracontrol.devices,但是其需要呼叫下面兩個庫 對前乙個專案進行一些修改 1.解決方案 新增 新建專案 類庫 net framework 新增csharptestdll2 ...
怎麼使用C 呼叫C dll 類庫
今天公司有需要與第三方的硬體廠商進行對接,一般硬體廠商提供的大多為c dll 這就涉及到c 呼叫c 了,首先我們需要看一下c dll 裡面定義的是什麼方法,包括傳遞的引數 dll 檔案不便上傳下面舉例說明是怎麼實現的 例如c 方法是這樣定義的 int stdcall unpackdatafile c...
C 呼叫C 類庫生成的dll
新建專案 visual c 類庫 net framework 在 bin debug xx.dll 新建專案 visual c 空專案 右鍵屬性 常規 專案預設值 公共語言執行時支援 clr 將生成的dll檔案拷貝到debug目錄下 如果是release則拷貝到release目錄下 原始檔 新增 新...