当前位置:
首页 >
【原】 动态加载dll
发布时间:2025/7/14
45
豆豆
生活随笔
收集整理的这篇文章主要介绍了
【原】 动态加载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);
转载于:https://www.cnblogs.com/luofuxian/articles/5501679.html
总结
以上是生活随笔为你收集整理的【原】 动态加载dll的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: Expressions are not
- 下一篇: keyword-- final