/// <summary> /// 根据dll的路径,dll中的方法名,动态调用非托管dll的方法 /// </summary> /// <param name="dllPath">dll的路径</param> /// <param name="functionName">要调用的dll的方法名称</param> /// <param name="delegateType">要将对应非托管dll中的方法名映射为C#的签名一致的委托类型</param> /// <param name="msg">执行过程中的错误信息</param> /// <param name="par">执行方法的参数</param> /// <returns></returns> private static object DynamicInvoke(string dllPath, string functionName, Type delegateType, out string msg, params object[] par) { msg = ""; int address = 0; try { address = Kernel32Helper.LoadLibrary(dllPath); if (address == 0) { //msg = "加载dll失败,dll路径:" + dllPath; msg = "fail to load dll :" + dllPath; return(null); } Delegate d1 = GetFunctionAddress(address, functionName, delegateType); if (d1 == null) { //msg = "获取函数名称失败,函数名称:" + functionName; msg = "fail to load function :" + functionName; return(null); } object result = d1.DynamicInvoke(par); Kernel32Helper.FreeLibrary(address); return(result); } catch (Exception e) { if (address != 0) { Kernel32Helper.FreeLibrary(address); } msg = e.Message; return(null); } }
/// <summary> /// 根据非托管库的句柄,函数名称和指定委托类型,返回委托 /// </summary> /// <param name="dllModule"></param> /// <param name="functionName"></param> /// <param name="t"></param> /// <returns></returns> private static Delegate GetFunctionAddress(int dllModule, string functionName, Type t) { int address = Kernel32Helper.GetProcAddress(dllModule, functionName); //得到地址 if (address == 0) { return(null); } else { return(Marshal.GetDelegateForFunctionPointer(new IntPtr(address), t));//将非托管函数指针转换为委托。 } }