2009-07-18 110 views
4

我想使用System.Reflection.Emit中的类创建一个简单的应用程序。如何将enrypoint指令添加到Main方法?如何将.entrypoint指令添加到方法(动态程序集)

AssemblyName aName = new AssemblyName("Hello"); 
AssemblyBuilder aBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(aName, AssemblyBuilderAccess.Save); 

ModuleBuilder mBuilder = aBuilder.DefineDynamicModule("Module"); 

TypeBuilder tb = mBuilder.DefineType("Program", TypeAttributes.Public); 

MethodBuilder methodBuilder = tb.DefineMethod("Main", MethodAttributes.Public | MethodAttributes.Static); 

ILGenerator ilGenerator = methodBuilder.GetILGenerator(); 
ilGenerator.EmitWriteLine("Hello!"); 

aBuilder.SetEntryPoint(methodBuilder); 
tb.CreateType(); 
aBuilder.Save("Hello.exe"); 

AssemblyBuilder.SetEntryPoint似乎没有达到此目的。

回答

5

试试这个(我已经把对修改的行注释):

AssemblyName aName = new AssemblyName("Hello"); 
AssemblyBuilder aBuilder = AppDomain 
    .CurrentDomain 
    .DefineDynamicAssembly(aName, AssemblyBuilderAccess.Save); 
// When you define a dynamic module and want to save the assembly 
// to the disc you need to specify a filename 
ModuleBuilder mBuilder = aBuilder 
    .DefineDynamicModule("Module", "Hello.exe", false); 
TypeBuilder tb = mBuilder 
    .DefineType("Program", TypeAttributes.Public); 
MethodBuilder methodBuilder = tb 
    .DefineMethod("Main", MethodAttributes.Public | MethodAttributes.Static); 

ILGenerator ilGenerator = methodBuilder.GetILGenerator(); 
ilGenerator.EmitWriteLine("Hello!"); 

// You need to always emit the return operation from a method 
// otherwise you will get an invalid IL 
ilGenerator.Emit(OpCodes.Ret); 

aBuilder.SetEntryPoint(methodBuilder); 
tb.CreateType(); 
aBuilder.Save("Hello.exe"); 
+0

谢谢,这是有效的。你知道模块需要知道程序集保存到的文件名的原因吗? – weiqure 2009-07-18 11:04:39

1

看一看ATT他example,我只是试着代码我和它的工作原理很nicley。