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-interfacesAnonymous
May 26, 2009
PingBack from http://castironbakeware.info/story.php?title=joel-pobar-s-clr-weblog-hello-world-reflection-emit-styleAnonymous
June 08, 2009
PingBack from http://hairgrowthproducts.info/story.php?id=7105Anonymous
June 16, 2009
PingBack from http://workfromhomecareer.info/story.php?id=27276