Mono Cecil将方法添加到装配中

时间:2014-07-20 17:09:43

标签: c# .net mono mono.cecil

我正在尝试使用一个方法调用将一个新类添加到一个程序集中,我试图从此程序集中的其他位置调用。目前我有以下内容:

ParameterDefinition param = new ParameterDefinition("Param", ParameterAttributes.None, mod.Import(typeof(string)));
Collection<Instruction> methodInstructions = new Collection<Instruction>();
methodInstructions.Add(Instruction.Create(OpCodes.Ldarg_0));
methodInstructions.Add(Instruction.Create(OpCodes.Ret));
MethodDefinition newMtd = MethodCreator.CreateMethod("ExampleMethod", mod, methodInstructions, param, typeof(string));
// Lets add the new method to the module entrypoint declaring type
TypeDefinition Class = new TypeDefinition("MyNamespace", "MyNewClass", TypeAttributes.Class);
mod.Types.Add(Class);
Class.Methods.Add(newMtd);

这会按预期创建新方法和类,这可以在.net反射器中看到。所有这个方法都会返回传递的参数(这是预期的结果)。我试图使用以下代码调用此方法:

public void InsertCalls(MethodDefinition methodToInsertCallsTo, MethodDefinition methodToCall)
{
    ILProcessor ilp = methodToInsertCallsTo.Body.GetILProcessor();
    for (int i = 0; i < methodToInsertCallsTo.Body.Instructions.Count; i++)
    {
        if (methodToInsertCallsTo.Body.Instructions[i].OpCode == OpCodes.Ldstr)
        {
            Instruction loadString = methodToInsertCallsTo.Body.Instructions[i];
            ilp.InsertAfter(loadString, Instruction.Create(OpCodes.Call, methodToCall));
        }
    }
}

所以这一切都是在每次遇到Ldstr操作码时插入对我创建的方法的调用。这个插入工作正常,但是当调用该方法时,我在程序集中得到了这个错误,我将这些调用插入到:

  

System.TypeLoadException:无法加载类型。从汇编WinFormsTest,因为父级不存在。

有没有人对可能导致这种情况的原因有任何想法?

1 个答案:

答案 0 :(得分:3)

一个老问题,但答案是:

新构造的TypeDefinitions将其BaseType prop设置为null,这对于类无效。尝试将其设置为TypeSystem.Object。