哪些工具执行IL的后编译修改?

最近提到的PostSharp让我想起了这个:

去年我工作的地方,我们正在考虑使用PostSharp将检测注入我们的代码中。 这是在Team Foundation Server团队构建/持续集成环境中。

考虑到这一点,我对PostSharp的操作方式产生了一种唠叨的感觉 – 它编辑了编译器生成的IL。 这让我感到困扰。

我并不担心PostSharp不能正常工作; 我很担心这是我第一次回忆起这样的工具。 我担心其他工具可能不会考虑到这一点。

事实上,随着我们前进,我们确实遇到了一些问题,因为PostSharp对原始IL所处的文件夹感到困惑。这打破了我们的构建。 它似乎是由于与MSBUILD目标的冲突解决了项目引用。 冲突似乎是由于PostSharp使用临时目录来存储IL的未修改版本。

无论如何,我当时没有StackOverflow来引用! 既然我这样做了,我想问你们所有人是否知道编辑IL作为构建过程的一部分的任何其他工具; 或者Microsoft是否在Visual Studio,MSBUILD,Team Build等中考虑了这种工具。


更新:感谢您的回答。

最重要的是,至少在VS 2010中,微软真的应该意识到这种事情会发生。 因此,如果在VS2010中存在这方面的问题,那么微软可能会分担责任。

我知道Dotfuscator是一个代码混淆器,它确实修改了程序集程序集的IL,并且它在许多构建过程中使用。

IL不仅可以修改代码混淆和保护,还可以为应用程序注入其他function(请参阅我们在Runtime Intelligence上的(PreEmptive)博客文章)。

此外,Microsoft的Common Compiler Infrastructure还能够读入程序集,修改它们并重写它们。 请参阅CodePlex以了解该项目。

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

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

.NET 4.0包含Microsoft Research的代码契约项目,该项目在方法的前/后条件下执行运行时(以及一些编译时)断言。 断言在库中实现,.NET编译器在IL中的方法调用中发出前/后条件。 但是,由于合同通常在方法的开头指定,因此辅助工具需要重写IL以使断言按正确的顺序排列并更正位置。

编辑:

  • cccheck是在构建后运行的工具,是一个在编译时validation合同的静态检查器
  • ccrewrite是在cccheck后运行的工具,重写IL并从合同中生成运行时检查

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

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

Fody是一个基于插件架构编织.net程序集的可扩展工具。