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.