【问题标题】:Method import using Mono.Cecil使用 Mono.Cecil 导入方法
【发布时间】:2013-12-19 15:12:37
【问题描述】:

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

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 Write 调用之后它会抛出一个错误:

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

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

知道我该怎么做吗?

【问题讨论】:

    标签: c# .net mono.cecil


    【解决方案1】:

    我找到了解决方案。 原因真的很搞笑。

    Module.Import()方法必须从我们要修改的当前模块调用,而不是定义方法的模块。从原docs不清楚。

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

    【讨论】:

      猜你喜欢
      • 2017-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-27
      • 1970-01-01
      相关资源
      最近更新 更多