使用Mono.Cecil导入方法

时间:2013-12-03 14:03:30

标签: c# .net mono.cecil

请用方法导入帮我​​。 我想编织程序集和从另一个程序集中定义的基类注入方法调用引用(实际上它是定义编织代码的程序集)。

private void InsertCallSetReference()
{
    //Get the load instruction to replace
    var ilProcessor = Property.SetMethod.Body.GetILProcessor();
    var argumentLoadInstructions = ilProcessor.Body.Instructions.ToList();

    MethodReference methodReference = ImportMethod("SetReference");

    foreach (var instruction in argumentLoadInstructions)
    {
        if (instruction.OpCode == OpCodes.Stfld)
        {
            ilProcessor.InsertAfter(instruction, ilProcessor.Create(OpCodes.Call, methodReference));
            ilProcessor.InsertAfter(instruction, ilProcessor.Create(OpCodes.Ldarg_1));
            ilProcessor.InsertAfter(instruction, ilProcessor.Create(OpCodes.Ldstr, DBFieldName));
            ilProcessor.InsertAfter(instruction, ilProcessor.Create(OpCodes.Ldarg_0));
            ilProcessor.Remove(instruction);
            break;
        }
    }
}

方法导入代码工作正常并返回方法引用

private MethodReference ImportMethod(string name)
{
     var type = MongoConnectModule.Import(typeof(BaseDataObject));
     return MongoConnectModule.Import(type.Resolve().Methods.First(m => m.Name == name));
}

但是在AssemblyDefinition写入调用之后它会抛出一个错误:

  

C:\ dev的\ MongoConnect \ WeavingTaskTest \织造\ CodeWeaving.targets(32,5):   错误MSB4018:System.ArgumentException:Member'System.Void   MongoConnect.BaseDataObject ::的SetProperty(System.String,System.Object的)”   在另一个模块中声明,需要导入

_assemblyDefinition.Write(_assemblyPath, new WriterParameters() { WriteSymbols = true, SymbolWriterProvider = debugWriterProvider });

知道我该怎么做吗?

1 个答案:

答案 0 :(得分:6)

我找到了解决方案。 原因很有趣。

必须从我们想要修改的当前模块调用

Module.Import()方法,而不是定义方法的模块。目前尚不清楚原始docs

例如,我们希望将Referenced.dll程序集中定义的某些方法添加到Main.dll程序集中。然后我们必须找到Main.dll程序集的主要模块,然后调用MainModule.Import(methodFromReferencedAssembly);