I dynamically subclass a generic type (filling out its contract) that has a generic method. I am trying to call this general method, but the assembly I am releasing has errors. The reflector crashes when you try to open the assembly, and this piece of code does not start.
An exception I get:
An attempt was made to download a program with the wrong format. (Exception from HRESULT: 0x8007000B)
Any help would be greatly appreciated. I am going to install PEVerify to look at the generated code.
using System;
using System.Reflection;
using System.Reflection.Emit;
public class TestClass<TFirst>
{
public void TestMethod<TSecond>()
{
Console.WriteLine("It works");
}
}
public class Program
{
static void Main(string[] args)
{
var assemblyName = new AssemblyName("DynamicAssembly");
var assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.RunAndSave);
var module = assemblyBuilder.DefineDynamicModule("DynamicAssembly.dll");
var testClass = typeof(TestClass<>);
var testClassOfObject = testClass.MakeGenericType(typeof(object));
var typeBuilder = module.DefineType(
"Voodoo.Dynamic.Class",
TypeAttributes.Public | TypeAttributes.Class,
testClassOfObject);
var methodBuilder = typeBuilder.DefineMethod("Run", MethodAttributes.Public);
var testGeneric = testClass.GetMethod("TestMethod").MakeGenericMethod(typeof(int));
var il = methodBuilder.GetILGenerator();
il.Emit(OpCodes.Ldarg_0);
il.Emit(OpCodes.Call, testGeneric);
il.Emit(OpCodes.Ret);
var classType = typeBuilder.CreateType();
assemblyBuilder.Save("DynamicAssembly.dll");
var instance = Activator.CreateInstance(classType);
classType.GetMethod("Run").Invoke(instance, new object[] { });
}
}
source
share