Вопрос

Помогите мне, пожалуйста, с помощью метода импорта. Я хочу сплетать сборку и ввести ссылку на вызов метода из базового класса, определенного в другой сборке (на самом деле это сборка, где определяется код ткачества).

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

Код импорта метода работает просто нормально и возвращает ссылку на метод

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

Но после сборки, выписываю, вызывает мне ошибку:

C: dev mongoconnect WeavingTaskTest Weaving Codeweaving.targets (32,5): Ошибка MSB4018: System.ArgumentException: Member 'System.Od MongoConnect.BasedAtaObject :: setProperty (System.Sting, System.Object)' decledAtaObject :: setPropert в другом модуле и необходимо импортировать

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

Есть идеи, как я мог бы это сделать?

Это было полезно?

Решение

Я нашел решение. Причина была действительно забавной.

Module.Import() Метод должен быть вызван из текущего модуля, который мы хотим изменить, а не модуль, где определяется метод. Это не ясно из оригинала док.

Например, мы хотим добавить некоторый метод, определенный в Referenced.dll Сборка к нашим Main.dll сборка. Тогда мы должны найти основной модуль нашего Main.dll сборка, а затем позвоните MainModule.Import(methodFromReferencedAssembly);

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top