C#调用C++ DLL的方式
? ? ?動(dòng)態(tài)鏈接庫(kù)(DLL)是一個(gè)包含可由多個(gè)程序同時(shí)使用的代碼和數(shù)據(jù)的庫(kù),DLL不是可執(zhí)行文件。可以說(shuō)在windows操作系統(tǒng)中隨處可見(jiàn),打開(kāi)主分區(qū)盤下的system32。在一些項(xiàng)目中,如果有大量運(yùn)算或者涉及大量算法時(shí)通常使用C或C++語(yǔ)言封裝成一個(gè)dll,開(kāi)放一些接口供其他程序調(diào)用。
? 下面是寫的一個(gè)簡(jiǎn)單的dll代碼,主要做示例,功能非常簡(jiǎn)單
1、dll提供外部調(diào)用的方法
extern "C" _declspec(dllexport) int Max(int a,int b); extern "C" _declspec(dllexport) int Sum(int a,int b); extern "C" _declspec(dllexport) int Min(int a,int b);2、方法的實(shí)現(xiàn)
int Max(int a,int b) {if(a>b)return a;elsereturn b; }int Sum(int a,int b) {return a+b; }int Min(int a,int b) {if(a>b)return b;elsereturn a; }本文主要是介紹使用C#如何調(diào)用DLL不是重點(diǎn),只做簡(jiǎn)單的介紹
一、C#調(diào)用DLL
在使用C#調(diào)用C++,需要使用系統(tǒng)Kernel32.dll來(lái)導(dǎo)入dill,一般需要如下三個(gè)函數(shù)
[DllImport("Kernel32",SetLastError=true)]private static extern int GetProcAddress(int handle,string funcName);[DllImport("Kernel32",SetLastError=true)]private static extern int LoadLibrary(string dllPath);[DllImport("Kernel32",SetLastError=true)]private static extern int FreeLibrary(int handle);其中:
LoadLibrary方法用來(lái)導(dǎo)入Dll
FreeLibrary方法用來(lái)釋放Dll
GetProcAdress方法用來(lái)獲取Dll中的方法訪問(wèn)的地址。
然后需要在C#中建立一個(gè)和C++中方法對(duì)應(yīng)的方法,以便在C#中調(diào)用,我們定義三個(gè)委托來(lái)完成這件事:
public delegate int Max(int a, int b);public delegate int Min(int a, int b);public delegate int Sum(int a, int b);然后我們定義三個(gè)委托的實(shí)例,使用上面的GetProAdress方法把地址指向委托實(shí)例的地址。全部代碼如下:
private int dllHandle = 0;public Max ProMax{get;set;}public Min ProMin{set;get;}public Sum ProSum{get;set;}// 獲取dll中的接口地址private static Delegate GetAddress(int dllModule, string functionname, Type t){int addr = GetProcAddress(dllModule, functionname);if (addr == 0)return null;elsereturn Marshal.GetDelegateForFunctionPointer(new IntPtr(addr), t);}public void FreeLinbary(){if (this.dllHandle >= 32){FreeLibrary(this.dllHandle);}}/// <summary>/// 加載Dll/// </summary>/// <returns>是否加載Dll成功</returns> public int LoadDll(string dllPath){this.dllHandle = LoadLibrary(dllPath);if (this.dllHandle >= 32){this.ProMax = (Max)GetAddress(dllHandle, "Max", typeof(Max));this.ProMin = (Min)GetAddress(dllHandle, "Min", typeof(Min));this.ProSum = (Sum)GetAddress(dllHandle, "Sum", typeof(Sum));return 0;}else{return 1;}} 整個(gè)調(diào)用流程比較簡(jiǎn)單,在C#調(diào)用C++寫的Dll過(guò)程中,關(guān)鍵是參數(shù)類型的對(duì)應(yīng)方面容易出錯(cuò),C++中的數(shù)據(jù)類型和C#中還是有些區(qū)別的,比如char在C#中是兩個(gè)字節(jié),在C++是一個(gè)字節(jié)。在C++中使用了指針,在C#中同樣需要使用IntPtr獲取其指針地址。?轉(zhuǎn)載于:https://www.cnblogs.com/JerryWang1991/p/3149759.html
總結(jié)
以上是生活随笔為你收集整理的C#调用C++ DLL的方式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Oracle学习笔记之一,重温范式
- 下一篇: SQLite在C#的使用