C#调用C++的DLL函数另一则(delegate) z
2014-04-22 20:25
393 查看
使用DLLImport进行导入函数的事. C#调用C++的函数其实不止这一种方法, 还有一种方法是用delegate申明函数委托进行调用,这种方法略显麻烦,但是可以进行回调并应用指针.
在C#中,首先先要定义一个类,用来把DLL中函数地址转换成委托:
然后, 用delegate声明函数:
再然后, 自己写个private的函数封装DLL中的函数, hModule()函数的作用是取得DLL的地址,用在多个输出函数中
在C#中,首先先要定义一个类,用来把DLL中函数地址转换成委托:
public class DLLWrapper { ///<summary> /// API LoadLibrary ///</summary> [DllImport("Kernel32")] public static extern int LoadLibrary(String funcname); ///<summary> /// API GetProcAddress ///</summary> [DllImport("Kernel32")] public static extern int GetProcAddress(int handle, String funcname); ///<summary> /// API FreeLibrary ///</summary> [DllImport("Kernel32")] public static extern int FreeLibrary(int handle); ///<summary> ///通过非托管函数名转换为对应的委托, by jingzhongrong ///</summary> ///<param name="dllModule">Get DLL handle by LoadLibrary</param> ///<param name="functionName">Unmanaged function name</param> ///<param name="t">ManageR type对应的委托类型</param> ///<returns>委托实例,可强制转换为适当的委托类型</returns> public static Delegate GetFunctionAddress(int dllModule, string functionName, Type t) { int address = GetProcAddress(dllModule, functionName); if (address == 0) return null; else return Marshal.GetDelegateForFunctionPointer(new IntPtr(address), t); } ///<summary> ///将表示函数地址的IntPtr实例转换成对应的委托, by jingzhongrong ///</summary> public static Delegate GetDelegateFromIntPtr(IntPtr address, Type t) { if (address == IntPtr.Zero) return null; else return Marshal.GetDelegateForFunctionPointer(address, t); } ///<summary> ///将表示函数地址的int转换成对应的委托,by jingzhongrong ///</summary> public static Delegate GetDelegateFromIntPtr(int address, Type t) { if (address == 0) return null; else return Marshal.GetDelegateForFunctionPointer(new IntPtr(address), t); } }
然后, 用delegate声明函数:
delegate void _amDBRSetThermoModel(int mid, ref int errid);
再然后, 自己写个private的函数封装DLL中的函数, hModule()函数的作用是取得DLL的地址,用在多个输出函数中
private int hModule() { int _hModule = DLLWrapper.LoadLibrary(DLLPATH); if (_hModule == 0) { return 0; } return _hModule; } private void amDBRInitialize() { try { _amDBRInitialize amf = (_amDBRInitialize)DLLWrapper.GetFunctionAddress(hModule(), "amDBRInitialize", typeof(_amDBRInitialize)); amf(); } catch (Exception e) { throw e; } }
相关文章推荐
- C#调用C++编写的DLL函数, 以及各种类型的参数传递 z
- C++ STL
- C++ 指针经典应用
- c++11---统一的初始化和初始化列表
- C语言的整型溢出问题
- C++实现golang chan 版本一
- C++编译期判断是否能够转型
- 基数排序---Java实现+C++实现
- C语言的整型溢出问题
- c++设计模式好文章 链接
- C++ 之Boost 实用工具类及简单使用
- 在c++中尽量使用const,enmu,inline来代替#define
- 操作符的优先级 (c++primer)
- C语言的库文件
- CEF C++环境搭建
- sizeof 操作符(c++primer)
- C++ Set 容器
- C语言库——静态库、共享库
- C++ Map容器
- C++ Deque 双向队列