我编写了下面的程序,以便理解IL中的对象构造和方法调用,不幸的是它没有打印
,你好吗?
在控制台上。
你有什么想法吗?
下面也给出了peverify的输出。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection.Emit;
using System.Reflection;
using System.IO;
namespace Research
{
public class Program
{
public static void Main(string[] args)
{
AssemblyName name =
new AssemblyName(Path.GetFileNameWithoutExtension("Hello"));
AssemblyBuilder asmb =
System.AppDomain.CurrentDomain.DefineDynamicAssembly(name,
AssemblyBuilderAccess.Save);
ModuleBuilder modb = asmb.DefineDynamicModule("Hello");
TypeBuilder typeBuilder = modb.DefineType("Bar");
MethodBuilder methb =
typeBuilder.DefineMethod("Me", MethodAttributes.Static,
typeof(void), System.Type.EmptyTypes);
ILGenerator gen = methb.GetILGenerator();
ConstructorInfo cil = typeof(Research.Dog).GetConstructor(new Type[] { });
gen.Emit(OpCodes.Newobj, cil);
gen.Emit(OpCodes.Call, typeof(Research.Dog).GetMethod("Bark"));
gen.Emit(OpCodes.Ret);
}
}
public class Dog
{
public void Bark()
{
Console.WriteLine("How are you doing");
}
}
}C:\temp\Research\Research\bin\Release>peverify
Research.exe
微软(R) .NET框架PE验证器。版本4.0.30319.1版权(c)微软公司。版权所有。
Research.exe中的所有类和方法都得到了验证。
C:\temp\Research\Research\bin\Release>
发布于 2011-06-05 13:45:25
您创建一个动态程序集,然后对它不做任何操作。为什么要打印任何东西?此外,在这里,generated对您没有任何帮助,因为您不是在验证您生成的程序集,而是只验证生成它的程序集。
您也不调用typeBuilder.CreateType(),这是必要的,而且程序集设置为无法运行。
如果您使用AssemblyBuilderAccess.RunAndSave并在方法的末尾添加以下代码,它将工作(至少对我有效):
var barType = typeBuilder.CreateType();
var meMethod = barType.GetMethod("Me", BindingFlags.Static | BindingFlags.NonPublic);
meMethod.Invoke(null, null);https://stackoverflow.com/questions/6242698
复制相似问题