質問

メソッドのインポートで私を助けてください。アセンブリを織り、他のアセンブリで定義された基本クラスからのメソッドコールリファレンスを挿入したい(実際、織りコードが定義されているアセンブリです)。

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 weaving codeweaving.targets(32,5):エラーmsb4018:system.argumentexception:member 'system.void mongoconnect.basedataobject :: setProperty(System.Systing)別のモジュールでは、インポートする必要があります

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

どうやってそれをすることができるのかという考えはありますか?

役に立ちましたか?

解決

解決策を見つけました。理由は本当に面白かった。

Module.Import() メソッドが定義されているモジュールではなく、変更する現在のモジュールからメソッドを呼び出す必要があります。オリジナルからは明らかではありません ドキュメント.

たとえば、で定義された方法を追加したい Referenced.dll 私たちへのアセンブリ Main.dll 組み立て。次に、メインモジュールを見つけなければなりません Main.dll アセンブリして、電話してください MainModule.Import(methodFromReferencedAssembly);

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top