提问人:John Saunders 提问时间:7/16/2009 最后编辑:John Saunders 更新时间:8/11/2015 访问量:2298
哪些工具可以对 IL 进行编译后修改?
Which Tools Perform Post-Compile Modification of IL?
问:
最近提到 PostSharp 让我想起了这一点:
去年我工作的地方,我们正在考虑使用 PostSharp 将检测注入到我们的代码中。这是在 Team Foundation Server Team Build/持续集成环境中。
想到这里,我对 PostSharp 的运行方式有一种唠叨的感觉——它编辑编译器生成的 IL。这让我有点困扰。
我不太担心 PostSharp 无法正确完成其工作;我很担心这是我第一次听说这样的工具。我担心其他工具可能没有考虑到这一点。
事实上,随着我们的前进,我们确实遇到了一些问题,因为 PostSharp 对原始 IL 所在的文件夹感到困惑。这破坏了我们的构建。这似乎是由于与解析项目引用的 MSBUILD 目标冲突。冲突似乎是由于 PostSharp 使用临时目录来存储 IL 的未修改版本。
无论如何,那时我没有 StackOverflow 可以参考!现在我这样做了,我想问大家,你是否知道在构建过程中编辑 IL 的任何其他工具;或者Microsoft是否在Visual Studio,MSBUILD,Team Build等中考虑了这种工具。
更新:感谢您的回答。
底线似乎是,至少在VS 2010中,Microsoft确实应该意识到这种事情可能会发生。因此,如果VS2010在这方面存在问题,那么Microsoft可能会分担责任。
答:
我知道 Mono.Cecil,一个扩展了 System.Reflection 工具集的框架库,它被 LinFu 项目使用。
我不确定构建过程支持,您应该检查它们的大小。
评论
.NET 4.0 包括来自 Microsoft Research 的代码协定项目,该项目对方法的前/后条件执行运行时(和某些编译时)断言。断言在库中实现,.NET 编译器将前/后条件作为 IL 中的方法调用发出。但是,由于协定通常在方法的开头指定,因此辅助工具需要重写 IL,以便将断言按正确的顺序和正确的位置放置。
编辑:
- cccheck 是在构建后运行的工具,是一个静态检查器,用于在编译时验证合约
- ccrewrite 是运行 post cccheck 的工具,重写 IL 并从合约生成运行时检查
(我找不到有关这些工具的任何其他技术信息)
我还没有使用过 Visual Studio 2010,但我已经看过代码协定功能的演示,它已集成到 IDE 构建过程中。cccheck 必须始终运行,如果生成的程序集中存在协定,则返回代码。如果它们存在,则代码将表示 ccrewrite 应该运行。
评论
我确实知道 Dotfuscator(一个代码混淆器)确实修改了程序集程序集的 IL,并且它用于许多生成过程。
修改 IL 不仅是为了代码模糊和保护,也是为了将其他功能注入到您的应用程序中(请参阅此处的 (PreEmptive) 关于运行时智能的博客文章)。
此外,Microsoft的通用编译器基础结构能够读取程序集,修改它们并重写它们。有关该项目,请参阅 CodePlex。
Fody 是一个可扩展的工具,用于基于插件体系结构编织 .net 程序集。
评论