Подтвердить что ты не робот

Создание статического конструктора [Mono.Cecil]

У меня возникли проблемы со статическими конструкторами с моим проектом. Мне нужно добавить статический конструктор к типу "", чтобы вызвать метод дешифрования ресурсов.

Ниже в gif вы увидите проблему, с которой я сталкиваюсь.

Я также включу фрагмент кода. enter image description here

Код для создания cctor:

MethodDefinition method = new MethodDefinition(
    ".cctor",
    Mono.Cecil.MethodAttributes.Private
    | Mono.Cecil.MethodAttributes.Static
    | Mono.Cecil.MethodAttributes.HideBySig
    | Mono.Cecil.MethodAttributes.SpecialName
    | Mono.Cecil.MethodAttributes.RTSpecialName,
    mod.Import(typeof(void))
); 

Я также попытался изменить атрибуты так же, как и Yano. Это почему-то никогда не срабатывает. Под "works" я имею в виду обнаружить его как статический конструктор в DotNet Resolver.

Вот еще информация о реальном исходе и ожидаемом результате.

enter image description here

У меня нет ResolveEventHandler, прикрепленного к моей точке входа. Я прикреплен к приложению, которое запутывается, и оно находится в статическом конструкторе типа "", который выполняется до того, как вызывается даже точка входа.

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

Любая помощь приветствуется.

4b9b3361

Ответ 1

используйте это:

void AddConstructor(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);
}

вы также можете обратиться:

http://www.mono-project.com/Cecil:FAQ