環境: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