How to add .entrypoint directive to a method (dynamic assembly)

I want to create a simple application using the classes in System.Reflection.Emit. How to add enrypoint directive to Main method?

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 does not seem to achieve this.

+4
source share
2 answers

Try this (I added comments on modified lines):

 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"); 
+5
source

Look at an example , I just tried the code myself, and it works very well.

+1
source

All Articles