Pregunta

Ayúdame por favor con la importación del método. Quiero tejer el ensamblaje e inyección de la referencia de llamadas de método de la clase base definida en el otro ensamblaje (de hecho, es el ensamblaje donde se define el código de tejido).

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

El código de importación del método funciona bien y devuelve la referencia del método

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

Pero después de la redacción de la escritura, llame, me arroja un error:

C: dev MongoConnect WeavingTaskTest Weaving Codeweaving.Targets (32,5): Error MSB4018: System.ArGumentException: Miembro 'System.Void MongoConnect.BasedAns en otro módulo y debe importarse

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

¿Alguna idea de cómo podría hacer eso?

¿Fue útil?

Solución

He encontrado la solución. La razón fue realmente divertida.

Module.Import() El método debe llamarse desde el módulo actual que queremos modificar, no el módulo donde se define el método. No está claro en original documentos.

Por ejemplo, queremos agregar algún método definido en el Referenced.dll asamblea a nuestro Main.dll asamblea. Entonces tenemos que encontrar el módulo principal de nuestro Main.dll ensamblaje y luego llamar MainModule.Import(methodFromReferencedAssembly);

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top