我找到了解决方案。原因真的很有趣。
Module.Import()
必须从我们要修改的当前模块中调用方法,而不是定义方法的模块。从原创中不清楚 文档.
例如,我们想添加一些在 Referenced.dll
组装给我们 Main.dll
部件。然后我们必须找到我们的主要模块 Main.dll
组装,然后致电 MainModule.Import(methodFromReferencedAssembly);
题
请帮助我进口方法。我想从另一个组件中定义的基类编织组件和注入方法调用参考(实际上是定义编织代码的程序集)。
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));
}
但是,在汇编定义后写调用后,它给我带来了一个错误:
c: dev mongoconnect weavingTaskTaskTest Weaving codeweaving.targets(32,5):错误msb4018:system.argumentException:member'system.void mongoconnect.basedabsedatabect.basedataabject :: setproperty(setProperty(SETPROPERTY)在另一个模块中需要导入
_assemblyDefinition.Write(_assemblyPath, new WriterParameters() { WriteSymbols = true, SymbolWriterProvider = debugWriterProvider });
知道我该怎么做?
解决方案
我找到了解决方案。原因真的很有趣。
Module.Import()
必须从我们要修改的当前模块中调用方法,而不是定义方法的模块。从原创中不清楚 文档.
例如,我们想添加一些在 Referenced.dll
组装给我们 Main.dll
部件。然后我们必须找到我们的主要模块 Main.dll
组装,然后致电 MainModule.Import(methodFromReferencedAssembly);