Pergunta

Ajude -me por favor com a importação de métodos. Quero tecer a referência de chamada de montagem e injeção da classe base definida na outra montagem (na verdade é a montagem onde o código de tecelagem é definido).

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

O código de importação do método funciona bem e referência de método de retorno

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

Mas após o AssemblyDefinition Write Call, ele me joga um erro:

C: dev mongoconnect weavingTaskTest tecelagem codeweveving.targets (32,5): erro msb4018: System.argumentException: membro 'System.Void MonGoconnect.BasedataObject :: SetProperty (System.string, System.Object)' é 'é' é 'é' '' ''. em outro módulo e precisa ser importado

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

Alguma ideia de como eu poderia fazer isso?

Foi útil?

Solução

Eu encontrei a solução. O motivo foi realmente engraçado.

Module.Import() O método deve ser chamado do módulo atual que queremos modificar, não o módulo em que o método é definido. Não está claro do original documentos.

Por exemplo, queremos adicionar algum método definido no Referenced.dll montagem para o nosso Main.dll conjunto. Então temos que encontrar o módulo principal do nosso Main.dll montagem e depois ligar MainModule.Import(methodFromReferencedAssembly);

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top