【原】 动态加载dll
动态调用动态库步骤:
1、创建一个函数指针,其指针数据类型要与调用的DLL引出函数相吻合。
2、通过Win32 API函数LoadLibrary()显式的调用DLL,此函数返回DLL的实例句柄。
3、通过Win32 API函数GetProcAddress()获取要调用的DLL的函数地址,把结果赋给自定义函数的指针类型。
4、使用函数指针来调用DLL函数。
5、最后调用完成后,通过Win32 API函数FreeLibrary()释放DLL函数。
代码:
/// <summary> /// 动态加载dll /// </summary> public class DllInvoke { [DllImport("kernel32.dll")] private extern static IntPtr LoadLibrary(String path); [DllImport("kernel32.dll")] private extern static IntPtr GetProcAddress(IntPtr lib, String funcName); [DllImport("kernel32.dll")] private extern static bool FreeLibrary(IntPtr lib); /// <summary> /// dll动态加载的指针 /// </summary> private IntPtr m_DHLib; public DllInvoke(string DLLPath) { m_DHLib = LoadLibrary(DLLPath); this.CLIENT_Init(null, IntPtr.Zero); this.CLIENT_SetAutoReconnect(null, IntPtr.Zero); } //将要执行的函数转换为委托 private Delegate Invoke(String APIName, Type t) { IntPtr api = GetProcAddress(m_DHLib, APIName); return (Delegate)Marshal.GetDelegateForFunctionPointer(api, t); } public bool CLIENT_Init(DisConnectEventArgs cbDisConnect, IntPtr dwUser) { CLIENT_InitInvoke method = (CLIENT_InitInvoke)Invoke("CLIENT_Init", typeof(CLIENT_InitInvoke)); return method(cbDisConnect, dwUser); } ~DllInvoke() { FreeLibrary(m_DHLib); } }
定义委托:
/// <summary> /// 初始化大华SDK /// </summary> /// <param name="cbDisConnect"></param> /// <param name="dwUser"></param> /// <returns></returns> internal delegate bool CLIENT_InitInvoke(DisConnectEventArgs cbDisConnect, IntPtr dwUser);