c# - 尝试创建新类型时出现 InvalidProgramException

标签 c# .net reflection types reflection.emit

我有以下代码:

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 - Common Language Runtime detected an invalid program.

我的代码有什么问题,为什么会抛出这个异常?

最佳答案

问题在于 lambda 表达式包含一个字符串,该字符串在编译时不是以方法体结尾,而是以类型的元数据结尾。 lambda 中的 ldstr 指令通过元数据标记引用字符串。当您获取 IL 字节并将其复制到新方法时,新方法中的 ldstr 将具有无效的元数据标记。

关于c# - 尝试创建新类型时出现 InvalidProgramException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33244880/

相关文章:

c# - 使用 IPP .NET SDK for QuickBooks v3.0 的 SalesItemLineDetail 上没有可用的单价?

c# - 如何使用返回类型以List/Array的形式返回结果

c# - 取消已初始化并在另一个事件处理程序方法中运行的任务

c# - 将小数(2.75)转换为时间(2 :45)

c# - 更改背景切换按钮

java - 获取可从 java 源代码调用的类中的方法列表

java - ParameterizedType.getRawType() 返回 j.l.r.Type,而不是 Class<?>?

c# - Mongodb C# 驱动程序更新所有子数组元素

c# - 从事件处理程序确定发件人对象

c# - 在 Dispose 方法中取消 dispose