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

  

 

posted @ 2016-05-17 14:55  流浪者的飘  阅读(413)  评论(0编辑  收藏  举报