I eventually managed to figure it out. It should look something like this: 

using System;
 using Mono.Cecil;
 using Mono.Cecil.Cil;
 
 namespace CecilTest {
     class MainClass {
         public static void Main(string[] args) {
             var assemblyDef = AssemblyDefinition.CreateAssembly(
                 new AssemblyNameDefinition("CecilTestOutput", new Version(1
, 0)),
                 "CecilTestOutput",
                 ModuleKind.Dll
             );
             var modDef = assemblyDef.MainModule;
 
             var iface = new TypeDefinition("", "TestInterface", 
TypeAttributes.Abstract | TypeAttributes.Public | TypeAttributes.Interface);
 
             var ifaceT = new GenericParameter("TA", iface);
             iface.GenericParameters.Add(ifaceT);
 
             var ifaceMethod = new MethodDefinition("Value", 
MethodAttributes.HideBySig | MethodAttributes.Abstract | MethodAttributes.
Virtual | MethodAttributes.NewSlot | MethodAttributes.Public, ifaceT);
             iface.Methods.Add(ifaceMethod);
 
             modDef.Types.Add(iface);
 
             var cls = new TypeDefinition("", "TestClass", TypeAttributes.
Public);
 
             var clsT = new GenericParameter("TB", cls);
             cls.GenericParameters.Add(clsT);
 
             cls.BaseType = modDef.TypeSystem.Object;
 
             var clsBaseIface = new GenericInstanceType(iface);
             clsBaseIface.GenericArguments.Add(clsT);
             cls.Interfaces.Add(clsBaseIface);
 
             var clsMethod = new MethodDefinition("Value_override", 
MethodAttributes.HideBySig | MethodAttributes.Virtual | MethodAttributes.
NewSlot | MethodAttributes.Final | MethodAttributes.Public, clsT);
             clsMethod.Overrides.Add(GenericInstanceMethod(ifaceMethod, 
clsBaseIface));
             cls.Methods.Add(clsMethod);
 
             modDef.Types.Add(cls);
 
             clsMethod.Body.InitLocals = true;
 
             var local = new VariableDefinition(clsT);
             clsMethod.Body.Variables.Add(local);
 
             var gen = clsMethod.Body.GetILProcessor();
             gen.Emit(OpCodes.Ldloca, local);
             gen.Emit(OpCodes.Initobj, clsT);
             gen.Emit(OpCodes.Ldloc, local);
             gen.Emit(OpCodes.Ret);
 
             assemblyDef.Write("CecilTestOutput.dll");
 
         }
 
 
         public static MethodReference GenericInstanceMethod(MethodReference 
methodRef, TypeReference genericInstanceType) {
             var newMethodRef = new MethodReference(methodRef.Name, 
methodRef.ReturnType) {
                 HasThis = methodRef.HasThis,
                 ExplicitThis = methodRef.ExplicitThis,
                 DeclaringType = genericInstanceType,
                 CallingConvention = methodRef.CallingConvention,
             };
 
             foreach(var parameter in methodRef.Parameters) {
                 newMethodRef.Parameters.Add(new ParameterDefinition(
parameter.Name, parameter.Attributes, parameter.ParameterType));
             }
 
             foreach(var genericParameter in methodRef.GenericParameters) {
                 newMethodRef.GenericParameters.Add(new GenericParameter(
genericParameter.Name, newMethodRef));
             }
 
             return newMethodRef;
         }
     }
 }
 



-- 
-- 
--
mono-cecil
--- 
You received this message because you are subscribed to the Google Groups 
"mono-cecil" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to