Может кто-нибудь опубликовать пример вставки вызова в MessageBox.Show () с помощью dnlib?Я пытался понять это в течение нескольких недель, и в Интернете нет примеров.Вот код, который у меня сейчас есть:
string r = "";
foreach (Instruction i in method.Body.Instructions)
{
r += i.ToString() + "\r\n";
}
r += "\r\n\r\n\r\n\r\n";
method.Body.Instructions.Clear();
method.Body.Instructions.Add(dnlib.DotNet.Emit.OpCodes.Nop.ToInstruction());
method.Body.Instructions.Add(dnlib.DotNet.Emit.OpCodes.Ldstr.ToInstruction("changed method here!"));
method.Body.Instructions.Add(dnlib.DotNet.Emit.OpCodes.Call.ToInstruction(GetSystemMethod(typeof(MessageBox), "Show", new Type[] { typeof(string)})));
method.Body.Instructions.Add(dnlib.DotNet.Emit.OpCodes.Pop.ToInstruction());
method.Body.Instructions.Add(dnlib.DotNet.Emit.OpCodes.Ret.ToInstruction());
method.Body.UpdateInstructionOffsets();
foreach(Instruction i in method.Body.Instructions)
{
r += i.ToString() + "\r\n";
}
MessageBox.Show(r);
module.Write(Path.GetDirectoryName(file) + "\\protected-" + Path.GetFileName(file));
И это сообщение, которое он печатает:
Первый блокэто оригинальный, рабочий метод.Как видите, все то же самое, за исключением загруженной строки.
И это исключение, которое возникает, когда он пытается написать модуль:
dnlib.DotNet.Writer.ModuleWriterException: 'Method System.Windows.Forms.DialogResult System.Windows.Forms.MessageBox::Show(System.String) (06002BF5) is not defined in this module (TestProj.exe). A method was removed that is still referenced by this module.'
Не могли бы вы объяснить, что я делаю не так, или как должна выглядеть правильная вставка сообщения?Я нахожу странным, что нигде в Интернете нет примеров такой базовой функциональности.
Заранее благодарю за любую помощь!