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

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

Ниже на гифке вы увидите проблему, с которой я столкнулся.

Я также включу фрагмент кода. введите здесь описание изображения

Код для создания 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))
); 

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

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

введите здесь описание изображения

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

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

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


person user2699298    schedule 22.12.2013    source источник


Ответы (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

person Imran Ali Khan    schedule 26.12.2013
comment
Примечание: замените MethodAttributes.Public на MethodAttributes.Static и .ctor на .cctor, если вам нужен статический конструктор. - person Serg046; 01.09.2016