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

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

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

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

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

1
nl ja de
Не могли бы вы объяснить, почему вы пытаетесь это сделать? О каком типе вы говорите? Кроме того, что вы пробовали? Как это случилось?
добавлено автор svick, источник
public class Parent: Child {public Parent (int x, int y): base (x, y) {}//other stuff} в основном, я пытаюсь добавить этот конструктор. Я попробовал что-то вроде этого: msdn.microsoft.com/en-us/library/… Однако после вызова нового конструктора объект не наследуется от класса Child, а сам класс объекта. однако базовый конструктор вызывается в debug. Исходные коды были примерно такими: (игнорировать соглашение cecil)
добавлено автор user1934537, источник
ctorIL.Append (ctorIL.Create (Mono.Cecil.Cil.OpCodes.Ldarg_0)) & ZWNJ;; ctorIL.Append (ctorIL.Create (Mono.Cecil.Cil.OpCodes.Ldarg_1)) & ZWNJ;; ctorIL.Append (ctorIL.Create (Mono.Cecil.Cil.OpCodes.Ldarg_2)) & ZWNJ;; ctorIL.Append (ctorIL.Create (Mono.Cecil.Cil.OpCodes.Call, baseMethod)); ctorIL.Append (ctorIL.Create (Mono.Cecil.Cil.OpCodes.Ret));
добавлено автор user1934537, источник
ctorIL.Append (ctorIL.Create (Mono.Cecil.Cil.OpCodes.Ldarg_0)) & ZWNJ;; ctorIL.Append (ctorIL.Create (Mono.Cecil.Cil.OpCodes.Ldarg_1)) & ZWNJ;; ctorIL.Append (ctorIL.Create (Mono.Cecil.Cil.OpCodes.Ldarg_2)) & ZWNJ;; ctorIL.Append (ctorIL.Create (Mono.Cecil.Cil.OpCodes.Call, baseMethod)); ctorIL.Append (ctorIL.Create (Mono.Cecil.Cil.OpCodes.Ret));
добавлено автор user1934537, источник
Итак, прямо сейчас, я собираюсь попробовать что-то вроде этого: -Hook Assembly.Resolve event -Find типы, унаследованные от Child -Ad конструктора для каждого типа с Mono.Cecil -Записать новую сборку в файл -Загрузить новый файл сборки. правильный путь? Или есть другой способ сделать это?
добавлено автор user1934537, источник
Итак, прямо сейчас, я собираюсь попробовать что-то вроде этого: -Hook Assembly.Resolve event -Find типы, унаследованные от Child -Ad конструктора для каждого типа с Mono.Cecil -Записать новую сборку в файл -Загрузить новый файл сборки. правильный путь? Или есть другой способ сделать это?
добавлено автор user1934537, источник

2 ответы

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

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

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

From here https://github.com/Fody/EmptyConstructor/blob/master/Fody/ModuleWeaver.cs

6
добавлено

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

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

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

From here https://github.com/Fody/EmptyConstructor/blob/master/Fody/ModuleWeaver.cs

6
добавлено