-1

我只是想生成只生成一个 int 常量的代码。下面是代码: string name = Path.GetFileNameWithoutExtension(outputPath); 字符串文件名 = 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 时,它​​给出了异常为什么?

4

1 回答 1

0

如此处所指定您定义了一个返回类型为 void 的方法。

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

如果将 defineMethod 行替换为

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

你会做对的。

您通常可以使用ILspy反汇编您的可执行文件(或库)来发现大部分 IL 错误。

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

static void Main()
{
    12;
}

这显然是错误的。

于 2017-03-07T14:43:52.363 回答