добавление нового конструктора к существующему типу с помощью mono.cecil

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

И после прочтения некоторых статей я решил, что это невозможно со встроенными классами .net framework.

Итак, я получил Mono.Cecil, но не смог найти достойного примера, как этого добиться.

Я столкнулся с образцом, который копирует методы, но не реквизиты, поля и т. д.


person user1934537    schedule 28.12.2012    source источник
comment
Не могли бы вы объяснить, почему вы пытаетесь это сделать? О каком типе вы говорите? Кроме того, что вы пробовали? Как это не удалось?   -  person svick    schedule 28.12.2012
comment
public class Parent : Child { public Parent(int x, int y) : base(x, y) { } //другие вещи } в принципе, я пытаюсь добавить этот конструктор. Я пробовал что-то вроде этого: msdn.microsoft.com/en-us/library/ Однако после вызова нового конструктора объект наследуется не от дочернего класса, а от самого класса объекта. однако базовый конструктор вызывается при отладке. коды излучения были примерно такими: (игнорировать соглашение cecil)   -  person user1934537    schedule 28.12.2012
comment
ctorIL.Append(ctorIL.Create(Mono.Cecil.Cil.OpCodes.Ldarg_0)); ctorIL.Append(ctorIL.Create(Mono.Cecil.Cil.OpCodes.Ldarg_1)); ctorIL.Append(ctorIL.Create(Mono.Cecil.Cil.OpCodes.Ldarg_2)); ctorIL.Append(ctorIL.Create(Mono.Cecil.Cil.OpCodes.Call, baseMethod)); ctorIL.Append(ctorIL.Create(Mono.Cecil.Cil.OpCodes.Ret));   -  person user1934537    schedule 28.12.2012
comment
Итак, прямо сейчас я собираюсь попробовать что-то вроде этого: -Hook Assembly.Resolve event -Найти типы, унаследованные от Child -Добавить конструктор для каждого типа с помощью Mono.Cecil -Записать новую сборку в файл -Загрузить новый файл сборки Я в деле? правильный путь? Или есть другой способ сделать это?   -  person user1934537    schedule 28.12.2012


Ответы (1)


Это добавляет пустой конструктор

void AddEmptyConstructor(TypeDefinition type, MethodReference baseEmptyConstructor)
{
    var methodAttributes = MethodAttributes.Public | MethodAttributes.HideBySig | MethodAttributes.SpecialName | MethodAttributes.RTSpecialName;
    var method = new MethodDefinition(".ctor", methodAttributes, ModuleDefinition.TypeSystem.Void);
    method.Body.Instructions.Add(Instruction.Create(OpCodes.Ldarg_0));
    method.Body.Instructions.Add(Instruction.Create(OpCodes.Call, baseEmptyConstructor));
    method.Body.Instructions.Add(Instruction.Create(OpCodes.Ret));
    type.Methods.Add(method);
}

Вам нужно будет расширить его, чтобы передать дополнительные параметры.

Отсюда https://github.com/Fody/EmptyConstructor/blob/master/Fody/ModuleWeaver.cs

person Simon    schedule 05.01.2013