Создание конструкции try catch с помощью dnlib
Есть программа на C# которая добавляет в exe файл конструкцию try catch. В try специально кладется мусорный опкод (calli null), а в catch сам код метода. Посмотрел IL код в декомпиле, вроде все должно работать, но сам выходной файл не запускается. Почему? Как исправить?
using System.Linq;
using dnlib.DotNet;
using dnlib.DotNet.Emit;
class Program
{
static void Main(string[] args)
{
string pt = "prog.exe";
// Загрузка сборки
var module = ModuleDefMD.Load(pt);
// Перебираем все типы в сборке
foreach (var type in module.Types)
{
// Перебираем все методы в типе
foreach (var method in type.Methods)
{
if (!method.HasBody) continue;
if (method.Name == ".ctor" || method.Name == ".cctor") continue;
method.Body.Instructions.Insert(0, new Instruction(OpCodes.Calli, null));
ExceptionHandler item2 = new ExceptionHandler(ExceptionHandlerType.Catch)
{
HandlerStart = method.Body.Instructions[1],
HandlerEnd = method.Body.Instructions[method.Body.Instructions.Count - 1],
TryEnd = method.Body.Instructions[1],
TryStart = method.Body.Instructions[0]
};
method.Body.ExceptionHandlers.Add(item2);
//method.Body.OptimizeBranches();
//method.Body.OptimizeMacros();
//method.Body.KeepOldMaxStack = true;
}
}
// Сохраняем измененную сборку
var writerOptions = new dnlib.DotNet.Writer.ModuleWriterOptions(module);
writerOptions.Logger = DummyLogger.NoThrowInstance;
module.Write(pt + "___protected.exe", writerOptions);
}
}