Создание статического конструктора [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 или других декомпиляторов. Я просто спрашиваю, почему событие не запускается, поскольку оно должно запускаться, когда ресурс недействителен или отсутствует. Как вы можете видеть в примере, сообщение должно появляться до запуска приложения, но оно никогда не выполняется (строковое шифрование шифрует строки, поэтому его немного сложно увидеть там строку).
Любая помощь приветствуется.
Ответы
Ответ 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