这是一段封装了一个调用非托管MFC编写的动态链接库函数的方法,首先要向代码中加入以下连个命名空间以使用反射和元数据的调用。
using System.Reflection.Emit;
using System.Reflection;
假设我们有一个MFC动态链接库(getmyversion.dll),其中有这样一个函数int GetDllversion(char* verstr),该函数返回一个函数版本字符串。
方法将创建一个动态的对象集。用DefinePInvokeMethod方法创建一个函数,我们将用被创建的函数去访问我们需要的dll函数。为全局函数取名为CreateGlobalFunctions。用先前创建的GetMethod函数调用dll中的函数。
public object DynamicDllFunctionInvoke( string DllPath, string EntryPoint )
{
// 定义版本号字符串
byte[] verstr = new byte[1024];
//定义返回值类型
Type returnType = typeof(int);
//该方法的输入输出参数类型
Type [] parameterTypes = {typeof(byte[])};
object[] parameterValues = {verstr};
string entryPoint = entrypoint;
// 创建动态代码集和动态调用模块
AssemblyName asmName = new AssemblyName();
asmName.Name = "tempDll";
AssemblyBuilder dynamicAsm =
AppDomain.CurrentDomain.DefineDynamicAssembly(asmName,
AssemblyBuilderAccess.Run);
ModuleBuilder dynamicMod =
dynamicAsm.DefineDynamicModule("tempModule");
// 使用输入数据动态构建全局调用签名
MethodBuilder dynamicMethod = dynamicMod.DefinePInvokeMethod(
entryPoint, DllPath, MethodAttributes.Static | MethodAttributes.Public
| MethodAttributes.PinvokeImpl , CallingConventions.Standard,
returnType, parameterTypes, CallingConvention.Winapi,
CharSet.Ansi);
// 全局方法构建
dynamicMod.CreateGlobalFunctions();
// 得到调用方法的调用信息
MethodInfo mi = dynamicMod.GetMethod(EntryPoint);
// 调用静态方法并返回一个object型对象
object retval = mi.Invoke(null, parameterValues);
MessageBox.Show(System.Text.ASCIIEncoding.ASCII.GetString(verstr));
return retval;
}