使用C#調用C++類庫


環境:win10+VS2017

過程介紹:

1.使用C++編寫一個動態庫(DLL);

2.將DLL內函數導出;

3.使用C#進行調用;

4.方法調用;

5.在VS進行調試;

1.使用C++編寫簡單的DLL;

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文件進行導出;

 2 編譯完后,使用Denpends工具,打開該Dll,查看標記是否都已導出;

 

3.在C#中進行添加和調用;

這里采用DllImport特性標記方式進行導入

 這里需要注意類型得對應問題:

參數:  

  C++字符串(char *)->C# string

  C++字符串(char *)->C# Intptr 

  C++結構圖->C# Intptr

  結構體指針->C# Intptr

  整形指針->C# ref int

在C#類中添加相應結構的自定義結構體(注意結構體的順序),指定結構的內存分布為順序分布;

 

 4.方法調用;

  對於參數傳入類型:

  A類,B類方法,可以直接調用;

  對於Inptr參數的方法,可以在C#內申請內存空間傳入C++中進行賦值,並需要對指針釋放;

對於傳出的參數Intptr類型的可以進行數據讀取,將Intptr轉換為string類型:

對於自定義結構體的Intptr指針可以通過對指針偏移獲取數據:

 

 

2018.3.26

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM