1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
|
using System;
using System.Reflection;
using System.Reflection.Emit;
class Bla<T> {
public T t;
}
public class Entry
{
public static int Main()
{
Bla<int> d = new Bla<int>();
d.t = 99;
Instance();
AppDomain domain = AppDomain.CreateDomain ("test");
try {
domain.ExecuteAssembly ("Instance.exe");
} catch (Exception e) {
Console.WriteLine ("assembly has thrown "+e);
return 1;
}
return 0;
}
public static void Instance()
{
AssemblyName name = new AssemblyName("Instance");
AssemblyBuilder asmbuild = System.Threading.Thread.GetDomain().DefineDynamicAssembly(name, AssemblyBuilderAccess.RunAndSave);
ModuleBuilder mod = asmbuild.DefineDynamicModule("Instance.exe");
TypeBuilder G = mod.DefineType("G", TypeAttributes.Public);
Type T = G.DefineGenericParameters("T")[0];
Type GObj = G.MakeGenericType(new Type[] { typeof(object) });
ConstructorBuilder Ctor = G.DefineConstructor(MethodAttributes.Public, CallingConventions.Standard, null);
{
ILGenerator il = Ctor.GetILGenerator();
il.Emit(OpCodes.Ldarg_0);
il.Emit(OpCodes.Call, typeof(object).GetConstructor(new Type[0]));
il.Emit(OpCodes.Ret);
}
MethodBuilder Bar = G.DefineMethod("Bar", MethodAttributes.Public);
{
ILGenerator il = Bar.GetILGenerator();
il.Emit(OpCodes.Ret);
}
MethodBuilder Foo = G.DefineMethod("Foo", MethodAttributes.Public | MethodAttributes.Static );
{
ILGenerator il = Foo.GetILGenerator();
il.Emit(OpCodes.Newobj, Ctor);
il.Emit(OpCodes.Call, Bar);
il.Emit(OpCodes.Ret);
}
TypeBuilder M = mod.DefineType("M", TypeAttributes.Public);
MethodBuilder main = M.DefineMethod("Main", MethodAttributes.Public | MethodAttributes.Static );
{
ILGenerator il = main.GetILGenerator();
il.Emit(OpCodes.Call, TypeBuilder.GetMethod (GObj, Foo));
il.Emit(OpCodes.Ret);
}
asmbuild.SetEntryPoint (main);
G.CreateType();
M.CreateType();
asmbuild.Save("Instance.exe");
Console.WriteLine("ok");
}
}
|