Question

Aidez-moi s'il vous plaît avec l'importation de la méthode. Je veux tisser l'assemblage et injecter la référence d'appel de la méthode de la classe de base définie dans l'autre assemblage (en fait, c'est l'assemblage où le code de tissage est défini).

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

Le code d'importation de la méthode fonctionne très bien et renvoie la référence de la méthode

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

Mais après AssemblyDefinition, écrivez, appelez, cela me lance une erreur:

C: dev mongoconnect wavavingtasktest waving codewaving.targets (32,5): error msb4018: System.argumentException: membre 'System.Void Mongoconnect.BaseDataObject :: setProperty (System.String, System.Object)' est déclaré dans un autre module et doit être importé

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

Une idée comment je pourrais faire ça?

Était-ce utile?

La solution

J'ai trouvé la solution. La raison était vraiment drôle.

Module.Import() La méthode doit être appelée à partir du module actuel que nous voulons modifier, pas le module où la méthode est définie. Ce n'est pas clair d'origine docs.

Par exemple, nous voulons ajouter une méthode définie dans le Referenced.dll assemblage à notre Main.dll Assemblée. Ensuite, nous devons trouver le module principal de notre Main.dll assemblage puis appelez MainModule.Import(methodFromReferencedAssembly);

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top