Я пытаюсь позвонить в MessageBox.Show из dnlib.У меня есть эта функция, которая находит метод Show:
MethodDef GetSystemMethod(Type DeclaringType, string Methodname, Type[] MethodParams)
{
var filename = DeclaringType.Module.FullyQualifiedName;
var mod = ModuleDefMD.Load(filename);
TypeDef[] types = mod.GetTypes().ToArray();
foreach(TypeDef t in types)
{
if(t.Name==DeclaringType.Name)
{
foreach(var m in t.Methods)
{
bool ok = true;
int i = 0;
foreach(var p in m.Parameters)
{
if (p.Type.TypeName != MethodParams[i].Name) ok = false;
}
if(ok)
{
return m;
}
}
}
}
throw new Exception("System Method not found!");
}
И вот как я его использую:
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());
module.Write(Path.GetDirectoryName(file) + "\\changed-" + Path.GetFileName(file));
Когда я запускаю его, я получаю это исключение при попытке записимодуль в файл.Может кто-нибудь, пожалуйста, посмотрите и объясните, что я делаю не так?
dnlib.DotNet.Writer.ModuleWriterException: 'Method System.Windows.Forms.HelpInfo System.Windows.Forms.MessageBox::get_HelpInfo() (06002BE3) is not defined in this module (TestProj.exe). A method was removed that is still referenced by this module.'