使用C 呼叫C 類庫

2022-07-18 12:09:19 字數 2234 閱讀 4820

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目錄下 原始檔 新增 新...