【原】 动态加载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);

浙公网安备 33010602011771号