我有以下代码:
AssemblyBuilder newAssembly = AssemblyBuilder.DefineDynamicAssembly(new AssemblyName("CustomAssembly"), AssemblyBuilderAccess.Run);
ModuleBuilder newModule = newAssembly.DefineDynamicModule("CustomModule");
TypeBuilder newType = newModule.DefineType("CustomType", TypeAttributes.Public);
MethodBuilder newMethod = newType.DefineMethod("GetMessage", MethodAttributes.Public, typeof(string), Type.EmptyTypes);
byte[] methodBody = ((Func<string>)(() => "Hello, world!")).GetMethodInfo().GetMethodBody().GetILAsByteArray();
newMethod.CreateMethodBody(methodBody, methodBody.Length);
Type customType = newType.CreateType();
dynamic myObject = Activator.CreateInstance(customType);
string message = myObject.GetMessage();
但是,尝试调用
myObject.GetMessage()
时,在最后一行抛出异常:InvalidProgramException-公共语言运行时检测到无效程序。
我的代码有什么问题,为什么会引发此异常?
最佳答案
问题在于lambda表达式包含一个字符串,该字符串在编译时不以方法主体结尾,而是以类型的元数据结尾。 lambda中的ldstr
指令通过元数据令牌引用字符串。当获得IL字节并复制到新方法后,新方法中的ldstr
将具有无效的元数据令牌。