2009-07-18 3 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

1

Посмотрите ATT его example, я просто попытался код сам, и она работает очень nicley.

 Смежные вопросы

  • Нет связанных вопросов^_^