Domanda

Aiutami per favore con l'importazione del metodo. Voglio intrecciare l'assemblaggio e l'iniezione del metodo Chiamata Riferimento dalla classe base definita nell'altra assembly (in realtà è l'assemblaggio in cui è definito il codice di tessitura).

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;
        }
    }
}

Il codice di importazione del metodo funziona bene e restituisce riferimento metodo

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

Ma dopo l'assemblyDefinition Scrivi Call It mi lancia un errore:

C: dev Mongoconnect WeavingTaskTest Weaving codeweaving.targets (32,5): errore MSB4018: System.ArgumentException: Member 'System.Void Mongoconnect.BasedAtaObject :: SetProperty (System.string, System.Object)' è dichiarato in un altro modulo e deve essere importato

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

Qualche idea su come potrei farlo?

È stato utile?

Soluzione

Ho trovato la soluzione. Il motivo era davvero divertente.

Module.Import() Il metodo deve essere chiamato dal modulo corrente che vogliamo modificare, non il modulo in cui è definito il metodo. Non è chiaro dall'originale Documenti.

Ad esempio, vogliamo aggiungere qualche metodo definito in Referenced.dll assemblea al nostro Main.dll assemblaggio. Allora dobbiamo trovare il nostro modulo principale Main.dll assembly e poi chiama MainModule.Import(methodFromReferencedAssembly);

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top