2009-07-18 7 views
4

Ich möchte eine einfache Anwendung mit den Klassen in System.Reflection.Emit erstellen. Wie kann ich die Enrypoint-Direktive zur Main-Methode hinzufügen?Wie Sie die .entrypoint-Direktive zu einer Methode hinzufügen (dynamische Assembly)

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 scheint dies nicht zu erreichen.

Antwort

5

Versuchen Sie, diese (Ich habe auf modifizierten Zeilen setzen Kommentare):

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

Danke, das funktioniert. Kennen Sie den Grund, warum das Modul den Dateinamen wissen muss, in dem die Assembly gespeichert ist? – weiqure

1

Werfen Sie einen Blick att seine example, habe ich versucht, einfach den Code selbst und es funktioniert sehr nicley.