2009-07-18 48 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。

相關問題