Поделиться через


hello, world... Reflection.Emit style!

Before I head home, I thought I'd post up your typical “Hello, World” style app in Reflection.Emit. ~20 lines of C# code, not too bad for code generation of a Console.WriteLine. For those who don't know what Reflection.Emit is, or what it can do, have a look here here and here for starters.

using System;
using System.Reflection;
using System.Reflection.Emit;
using System.Threading;

public class EmitHelloWorld
{
      static void Main(string[] args)
      {
            // create a dynamic assembly and module
            AssemblyName assemblyName = new AssemblyName();
            assemblyName.Name = "HelloWorld";
            AssemblyBuilder assemblyBuilder = Thread.GetDomain().DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.RunAndSave);
            ModuleBuilder module;
            module = assemblyBuilder.DefineDynamicModule("HelloWorld.exe");
      
       // create a new type to hold our Main method
            TypeBuilder typeBuilder = module.DefineType("HelloWorldType", TypeAttributes.Public | TypeAttributes.Class);
            
            // create the Main(string[] args) method
            MethodBuilder methodbuilder = typeBuilder.DefineMethod("Main", MethodAttributes.HideBySig | MethodAttributes.Static | MethodAttributes.Public, typeof(void), new Type[] { typeof(string[]) });
            
            // generate the IL for the Main method
            ILGenerator ilGenerator = methodbuilder.GetILGenerator();
            ilGenerator.EmitWriteLine("hello, world");
            ilGenerator.Emit(OpCodes.Ret);

            // bake it
            Type helloWorldType = typeBuilder.CreateType();

            // run it
            helloWorldType.GetMethod("Main").Invoke(null, new string[] {null});

            // set the entry point for the application and save it
            assemblyBuilder.SetEntryPoint(methodbuilder, PEFileKinds.ConsoleApplication);
            assemblyBuilder.Save("HelloWorld.exe");
      }
}

Comments

  • Anonymous
    January 22, 2004
    How about providing us with a tutorial on using System.Diagnostics.SymbolStore?

  • Anonymous
    March 31, 2004
    http://localhost/
    <a href="http://localhost/">asdf</a>

  • Anonymous
    April 22, 2004
    How about providing scenarios description of how you would really want to use System.Reflection features?

    I've read "Generative Programming: Methods, Tools, and Applications" by Czarnecki and Eisenecker and it sounds like generics will be equivalent to Constrained genericty and F-Bounded polymorphism.

    What I'd like to know more about is some of the other kinds of generative techinques mentioned in this book and how they map to the .NET reflections framework. Specifically, Chapter 8 and 9 concepts and-or implementations of various uses of reflective features.
    I'd also like to know more about using attributes in conjuction with the JIT and the reflections libraries. Thanks for any future posts you make about these topics and how they may or may not intersect with Reflection, CLI/compiler features, or other core .NET libraries.

  • Anonymous
    April 27, 2004
    Peter,

    Sounds like a good plan. We're actually cooking up a document internally that describes patterns, practices, scenario's, perf and other interesting Reflection stories. Hopefully we can publish this externally in some fashion.

  • Anonymous
    January 21, 2009
    PingBack from http://www.keyongtech.com/649498-dynamicaly-implement-interfaces

  • Anonymous
    May 26, 2009
    PingBack from http://castironbakeware.info/story.php?title=joel-pobar-s-clr-weblog-hello-world-reflection-emit-style

  • Anonymous
    June 08, 2009
    PingBack from http://hairgrowthproducts.info/story.php?id=7105

  • Anonymous
    June 16, 2009
    PingBack from http://workfromhomecareer.info/story.php?id=27276