Как вставить вызов в MessageBox.Show () с помощью dnlib? - PullRequest
0 голосов
/ 24 декабря 2018

Может кто-нибудь опубликовать пример вставки вызова в 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));

И это сообщение, которое он печатает:

enter image description here

Первый блокэто оригинальный, рабочий метод.Как видите, все то же самое, за исключением загруженной строки.

И это исключение, которое возникает, когда он пытается написать модуль:

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.'

enter image description here

Не могли бы вы объяснить, что я делаю не так, или как должна выглядеть правильная вставка сообщения?Я нахожу странным, что нигде в Интернете нет примеров такой базовой функциональности.

Заранее благодарю за любую помощь!

...