【发布时间】:2018-11-20 15:12:06
【问题描述】:
我试图在 IL 代码中删除对 Tick 事件的订阅,以便它永远不会触发。
这是 IL 代码:
IL_0e19: ldftn instance void App.Framework.MainForm::mTimer_Tick(object, class [mscorlib]System.EventArgs)
IL_0e1f: newobj instance void [mscorlib]System.EventHandler::.ctor(object, native int)
IL_0e24: callvirt instance void [System.Windows.Forms]System.Windows.Forms.Timer::add_Tick(class [mscorlib]System.EventHandler)
IL_0e29: ldarg.0
所以我在想我应该能够删除最后两行来删除订阅,它应该没问题。
IL_0e24: callvirt instance void [System.Windows.Forms]System.Windows.Forms.Timer::add_Tick(class [mscorlib]System.EventHandler)
IL_0e29: ldarg.0
我成功编译了 IL 代码:
ilasm.exe c:\Framework.il /32bitpreferred /dll
现在,当我尝试启动程序时,它会抛出异常:
System.InvalidProgramException: JIT Compiler encountered an internal limitation.
如果我在没有任何修改的情况下编译 IL,则程序运行时不会出现任何异常,因此我正在做出更改。
【问题讨论】:
-
这听起来像是一种非常复杂的方法。反正。
callvirt期望this参数在堆栈上,所以这是问题的一部分。在程序集上运行 PEVerify 以获取 .NET 对您做错了什么的描述。要真正做到这一点,请在 C# 中编写您想要的代码,然后查看 ildasm(或其他 IL 反汇编程序)显示的内容。 -
您仍然需要调用
ldarg.0。 -
提示:在 dll 上运行
peverify -
@500-InternalServerError 如果您知道更简单的方法,请告诉我。
-
想到了更改原始高级源代码。
标签: c# .net intermediate-language ildasm ilasm