我正在尝试生成以下类:
public class MyType
{
public string MyMethod() { return "Hi"; }
}
我的 Emit 代码如下:
var assemblyBuilder = GetAssemblyBuilder("MyAssembly");
var moduleBuilder = assemblyBuilder.DefineDynamicModule("MyModule");
var typeBuilder = moduleBuilder.DefineType("MyType", TypeAttributes.Public);
var methodBuilder = typeBuilder.DefineMethod("MyMethod", MethodAttributes.Public, typeof(string), new Type[] { });
var ilBuilder = methodBuilder.GetILGenerator();
ilBuilder.Emit(OpCodes.Nop);
ilBuilder.Emit(OpCodes.Ldstr, "Hi");
ilBuilder.Emit(OpCodes.Stloc_0);
ilBuilder.Emit(OpCodes.Br_S);
ilBuilder.Emit(OpCodes.Ldloc_0);
ilBuilder.Emit(OpCodes.Ret);
var type = typeBuilder.CreateType();
但是,当我在
MyType
实例上调用MyMethod
时,我会收到一个InvalidProgramException
:Common Language Runtime检测到一个无效程序。我尝试将返回类型更改为void
,并仅使用EmitWriteLine
和Emit(OpCodes.Ret)
,它可以正常运行,所以问题肯定出在我写的IL上。
我是否漏掉了什么显而易见的东西?因为我刚开始使用Emit,所以需要一个清晰的解释。
来自评论的其他信息:
“原始”IL是从LINQ-pad中的IL生成中获取的。
Nop
的目的是什么? - dav_i