zoukankan      html  css  js  c++  java
  • C#中DllImport用法

    http://blog.csdn.net/u011981242/article/details/52622923

    http://www.jb51.net/article/46384.htm

    读取身份证:https://www.cnblogs.com/softcg/p/6510984.html

    析构函数:https://www.cnblogs.com/melao2006/p/4239302.html

    命名空间:

    using System.Runtime.InteropServices; // 用 DllImport 需用此 命名空间
    using System.Reflection; // 使用 Assembly 类需用此 命名空间
    using System.Reflection.Emit; // 使用 ILGenerator 需用此 命名空间

    /// <summary>  
        /// 参数传递方式枚举 ,ByValue 表示值传递 ,ByRef 表示址传递  
        /// </summary>  
        public enum ModePass
        {
            ByValue = 0x0001,
            ByRef = 0x0002
        }
        /// <summary>
        /// 动态加载非托管DLL(Dynamic Load DLL)
        /// </summary>
        public class DLD
        {
            /// <summary>  
            /// 原型是 :HMODULE LoadLibrary(LPCTSTR lpFileName);  
            /// </summary>  
            /// <param name="lpFileName">DLL 文件名 </param>  
            /// <returns> 函数库模块的句柄 </returns>  
            [DllImport("kernel32.dll")]
            static extern IntPtr LoadLibrary(string lpFileName);
    
            /// <summary>  
            /// 原型是 : FARPROC GetProcAddress(HMODULE hModule, LPCWSTR lpProcName);  
            /// </summary>  
            /// <param name="hModule"> 包含需调用函数的函数库模块的句柄 </param>  
            /// <param name="lpProcName"> 调用函数的名称 </param>  
            /// <returns> 函数指针 </returns>  
            [DllImport("kernel32.dll")]
            static extern IntPtr GetProcAddress(IntPtr hModule, string lpProcName);
    
            /// <summary>  
            /// 原型是 : BOOL FreeLibrary(HMODULE hModule);  
            /// </summary>  
            /// <param name="hModule"> 需释放的函数库模块的句柄 </param>  
            /// <returns> 是否已释放指定的 Dll</returns>  
            [DllImport("kernel32", EntryPoint = "FreeLibrary", SetLastError = true)]
            static extern bool FreeLibrary(IntPtr hModule);
    
            /// <summary>  
            /// Loadlibrary 返回的函数库模块的句柄
            /// </summary>  
            private IntPtr hModule = IntPtr.Zero;
    
            /// <summary>  
            /// GetProcAddress 返回的函数指针
            /// </summary>  
            private IntPtr farProc = IntPtr.Zero;
    
            /// <summary>  
            /// 装载 Dll
            /// </summary>  
            /// <param name="lpFileName">DLL 文件名 </param>  
            public void LoadDll(string lpFileName)
            {
                hModule = LoadLibrary(lpFileName);
                if (hModule == IntPtr.Zero)
                    throw (new Exception(" 没有找到 :" + lpFileName + "."));
            }
            /// <summary>
            /// 装载 Dll
            /// </summary>
            /// <param name="HMODULE">函数指针</param>
            public void LoadDll(IntPtr HMODULE)
            {
                if (HMODULE == IntPtr.Zero)
                    throw (new Exception(" 所传入的函数库模块的句柄 HMODULE 为空 ."));
                hModule = HMODULE;
            }
    
            /// <summary>  
            /// 获得函数指针  
            /// </summary>  
            /// <param name="lpProcName"> 调用函数的名称 </param>  
            public void LoadFun(string lpProcName)
            {
                // 若函数库模块的句柄为空,则抛出异常  
                if (hModule == IntPtr.Zero)
                    throw (new Exception(" 函数库模块的句柄为空 , 请确保已进行 LoadDll 操作 !"));
                // 取得函数指针  
                farProc = GetProcAddress(hModule, lpProcName);
                // 若函数指针,则抛出异常  
                if (farProc == IntPtr.Zero)
                    throw (new Exception(" 没有找到 :" + lpProcName + " 这个函数的入口点 "));
            }
    
            /// <summary>  
            /// 获得函数指针  
            /// </summary>  
            /// <param name="lpFileName"> 包含需调用函数的 DLL 文件名 </param>  
            /// <param name="lpProcName"> 调用函数的名称 </param>  
            public void LoadFun(string lpFileName, string lpProcName)
            {
                // 取得函数库模块的句柄  
                hModule = LoadLibrary(lpFileName);
                // 若函数库模块的句柄为空,则抛出异常  
                if (hModule == IntPtr.Zero)
                    throw (new Exception(" 没有找到 :" + lpFileName + "."));
                // 取得函数指针  
                farProc = GetProcAddress(hModule, lpProcName);
                // 若函数指针,则抛出异常  
                if (farProc == IntPtr.Zero)
                    throw (new Exception(" 没有找到 :" + lpProcName + " 这个函数的入口点 "));
            }
    
            /// <summary>  
            /// 卸载 Dll  
            /// </summary>  
            public void UnLoadDll()
            {
                FreeLibrary(hModule);
                hModule = IntPtr.Zero;
                farProc = IntPtr.Zero;
            }
            public Delegate Invoke(string APIName, Type t)
            {
                IntPtr api = GetProcAddress(hModule, APIName);
                return Marshal.GetDelegateForFunctionPointer(api, t);
            }
        }
  • 相关阅读:
    问题集
    第04次作业-树
    06-图
    05-查找
    04-树
    03-栈和队列
    02-线性表
    01-抽象数据类型
    C语言--总结报告
    C语言--函数嵌套
  • 原文地址:https://www.cnblogs.com/xsj1989/p/8297524.html
Copyright © 2011-2022 走看看