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); } }