我正在开发一个 IL 重写分析器,我的目标是能够向方法添加 try-finally 块。本质上:
// IL to set some state
try {
// original IL
} finally {
// IL to revert state
}
Run Code Online (Sandbox Code Playgroud)
根据分析 API ( https://msdn.microsoft.com/en-us/library/ms232096.aspx ) 的有限文档和信息,似乎应该能够使用 SetILFunctionBody 添加新的异常处理子句。
我一直在关注来自http://clrprofiler.codeplex.com/SourceControl/list/changesets?branch=master的 Microsoft 示例 ILRewrite 探查器。我添加了代码以将“EHCLause”添加到“ILRewriter”类维护的 EHCLause 列表中,并添加了适当的 left.s 和 endfinally IL 指令。从探查器的角度来看,一切似乎都正常(SetILFunctionBody 成功),但是当调用修改后的方法时,我们会收到可怕的“公共语言运行时检测到无效程序”。例外,没有进一步的信息。
我尝试过的事情:
这让我相信分析 API 可能不支持向没有任何异常处理子句的方法添加新的异常处理子句。我很想听听您的其他想法以及如何解决此问题的任何想法。
以下是来自日志记录的一些信息 - * 是原始 IL。
EXPORTING IL:
Offset IL notes
0 0x28 call EnterScope …Run Code Online (Sandbox Code Playgroud)