singrdk/base/Windows/mkmsil/EmitAssembly.cs

74 lines
3.1 KiB
C#

// ----------------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
// ----------------------------------------------------------------------------
//=====================================================================
//=====================================================================
using System;
using System.Threading;
using System.Reflection;
using System.Reflection.Emit;
public class App {
public static void Main(String[] args) {
AssemblyBuilder assembly;
assembly = (AssemblyBuilder) CreateCallee(Thread.GetDomain(), AssemblyBuilderAccess.Save).Assembly;
assembly.Save("EmittedAssembly.dll");
}
// Create the callee transient dynamic assembly.
private static Type CreateCallee(AppDomain appDomain) {
// Create a simple name for the callee assembly.
AssemblyName assemblyName = new AssemblyName();
assemblyName.Name = "EmittedAssembly";
// Create the callee dynamic assembly.
AssemblyBuilder assembly = appDomain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Save);
// Create a dynamic module named "CalleeModule" in the callee assembly.
ModuleBuilder module;
module = assembly.DefineDynamicModule("EmittedModule", "EmittedModule.mod");
// Define a public class named "HelloWorld" in the assembly.
TypeBuilder helloWorldClass = module.DefineType("HelloWorld", TypeAttributes.Public);
// Define a private String field named "Greeting" in the type.
FieldBuilder greetingField = helloWorldClass.DefineField("Greeting", typeof(String), FieldAttributes.Private);
// Create the constructor.
Type[] constructorArgs = { typeof(String) };
ConstructorBuilder constructor = helloWorldClass.DefineConstructor(
MethodAttributes.Public, CallingConventions.Standard, constructorArgs);
// Generate IL for the method. The constructor calls its superclass
// constructor. The constructor stores its argument in the private field.
ILGenerator constructorIL = constructor.GetILGenerator();
constructorIL.Emit(OpCodes.Ldarg_0);
ConstructorInfo superConstructor = typeof(Object).GetConstructor(new Type[0]);
constructorIL.Emit(OpCodes.Call, superConstructor);
constructorIL.Emit(OpCodes.Ldarg_0);
constructorIL.Emit(OpCodes.Ldarg_1);
constructorIL.Emit(OpCodes.Stfld, greetingField);
constructorIL.Emit(OpCodes.Ret);
// Create the GetGreeting method.
MethodBuilder getGreetingMethod = helloWorldClass.DefineMethod("GetGreeting",
MethodAttributes.Public, typeof(String), null);
// Generate IL for GetGreeting.
ILGenerator methodIL = getGreetingMethod.GetILGenerator();
methodIL.Emit(OpCodes.Ldarg_0);
methodIL.Emit(OpCodes.Ldfld, greetingField);
methodIL.Emit(OpCodes.Ret);
// Bake the class HelloWorld.
return(helloWorldClass.CreateType());
}
}