74 lines
3.1 KiB
C#
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());
|
||
|
}
|
||
|
}
|
||
|
|