哪些工具可以对 IL 进行编译后修改?

Which Tools Perform Post-Compile Modification of IL?

提问人:John Saunders 提问时间:7/16/2009 最后编辑:John Saunders 更新时间:8/11/2015 访问量:2298

问:

最近提到 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可能会分担责任。

C# PostSharp 中间语言

评论


答:

4赞 Kenan E. K. 7/16/2009 #1

我知道 Mono.Cecil,一个扩展了 System.Reflection 工具集的框架库,它被 LinFu 项目使用。

我不确定构建过程支持,您应该检查它们的大小。

评论

1赞 Yannick Motton 10/3/2009
Reflector 有一个名为 Reflexil(sebastien.lebreton.free.fr/reflexil) 的插件,它基于 Mono.Cecil。
4赞 Steve Guidi 7/16/2009 #2

.NET 4.0 包括来自 Microsoft Research 的代码协定项目,该项目对方法的前/后条件执行运行时(和某些编译时)断言。断言在库中实现,.NET 编译器将前/后条件作为 IL 中的方法调用发出。但是,由于协定通常在方法的开头指定,因此辅助工具需要重写 IL,以便将断言按正确的顺序和正确的位置放置。

编辑:

  • cccheck 是在构建后运行的工具,是一个静态检查器,用于在编译时验证合约
  • ccrewrite 是运行 post cccheck 的工具,重写 IL 并从合约生成运行时检查

(我找不到有关这些工具的任何其他技术信息)

我还没有使用过 Visual Studio 2010,但我已经看过代码协定功能的演示,它已集成到 IDE 构建过程中。cccheck 必须始终运行,如果生成的程序集中存在协定,则返回代码。如果它们存在,则代码将表示 ccrewrite 应该运行。

评论

0赞 John Saunders 7/16/2009
你能说说第二个工具吗?
3赞 Joe Kuemerle 7/16/2009 #3

我确实知道 Dotfuscator(一个代码混淆器)确实修改了程序集程序集的 IL,并且它用于许多生成过程。

修改 IL 不仅是为了代码模糊和保护,也是为了将其他功能注入到您的应用程序中(请参阅此处的 (PreEmptive) 关于运行时智能的博客文章)。

此外,Microsoft的通用编译器基础结构能够读取程序集,修改它们并重写它们。有关该项目,请参阅 CodePlex

1赞 Robert Brooker 8/11/2015 #4

Fody 是一个可扩展的工具,用于基于插件体系结构编织 .net 程序集。