为什么我得到System.InvalidProgramException:公共语言运行时检测到无效的程序

时间:2017-03-04 22:43:46

标签: compiler-errors .net-assembly system.reflection reflection.emit ilgenerator

我只想尝试生成只生成int常量的代码。这是代码:     string name = Path.GetFileNameWithoutExtension(outputPath);     string filename = Path.GetFileName(outputPath);

AssemblyName assemblyName = new AssemblyName(name);

AssemblyBuilder assembly = AppDomain.CurrentDomain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.RunAndSave); //, Path.GetDirectoryName(outputPath));
ModuleBuilder moduleBuilder = assembly.DefineDynamicModule(name, filename);

TypeBuilder programType = moduleBuilder.DefineType(name + ".Program");
MethodBuilder mainMethod = programType.DefineMethod("Main", MethodAttributes.Static, typeof(void), System.Type.EmptyTypes);
assembly.SetEntryPoint(mainMethod);
ILGenerator generator = mainMethod.GetILGenerator();
generator.Emit(OpCodes.Ldc_I4, (int)Value);
generator.Emit(OpCodes.Ret);
programType.CreateType();
assembly.Save(filename);

当我执行.exe时,它会给出异常 为什么呢?

1 个答案:

答案 0 :(得分:0)

根据指定的here,您可以定义一个具有void返回类型的方法。

但是你生成的IL会返回一个int(在ret指令之前的堆栈内容)。

如果用

替换defineMethod行
MethodBuilder mainMethod = programType.DefineMethod("Main", MethodAttributes.Static, typeof(int), System.Type.EmptyTypes);

你会做对的。

您通常可以使用ILspy查找大多数IL错误来反汇编您的可执行文件(或库)。

在你的情况下,你会看到:

static void Main()
{
    12;
}

这显然是错误的。