Frage

Helfen Sie mir bitte mit Methodenimport. Ich möchte die Montage und die Injektionsanrufreferenz aus der Basisklasse verweben, die in der anderen Baugruppe definiert ist (in der Tat ist es die Montage, in der das Webcode definiert ist).

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

Methodenimportcode funktioniert gut und gibt Methodenreferenz zurück

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

Aber nach der AssemblyDefinition schreibt Call It einen Fehler:

C: dev mongoconnect weavingtaskest weaving codeweaving.targets (32,5): Fehler MSB4018: System.ArgumentException: Mitglied 'System.void mongoconnect.basedataobject: in einem anderen Modul und muss importiert werden

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

Irgendeine Idee, wie ich das machen könnte?

War es hilfreich?

Lösung

Ich habe die Lösung gefunden. Der Grund war wirklich lustig.

Module.Import() Die Methode muss vom aktuellen Modul aufgerufen werden, das wir ändern möchten, nicht das Modul, in dem die Methode definiert ist. Es ist nicht klar aus dem Original Dokumente.

Zum Beispiel möchten wir eine in der definierte Methode hinzufügen Referenced.dll Montage zu unserer Main.dll Montage. Dann müssen wir das Hauptmodul von unserem finden Main.dll Montage und dann anrufen MainModule.Import(methodFromReferencedAssembly);

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top