5

最近提到 PostSharp 让我想起了这一点:

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

考虑到这一点,我对 PostSharp 的运行方式产生了一种烦人的感觉——它编辑了编译器生成的 IL。这让我有点困扰。

我不太担心 PostSharp 不能正确完成它的工作。我担心这是我第一次记得听说过这样的工具。我担心其他工具可能不会考虑到这一点。

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

无论如何,当时我没有 StackOverflow 可以参考!现在我知道了,我想问你们大家是否知道在构建过程中编辑 IL 的任何其他工具;或者微软是否在 Visual Studio、MSBUILD、Team Build 等中考虑了这种工具。


更新:感谢您的回答。

底线似乎是,至少在 VS 2010 中,微软确实应该意识到这种事情可能会发生。所以如果VS2010在这方面出现问题,那么微软可能会分担责任。

4

4 回答 4

4

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

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

于 2009-07-16T13:15:15.050 回答
4

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

编辑:

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

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

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

于 2009-07-16T14:27:28.070 回答
3

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

IL 的修改不仅用于代码混淆和保护,还用于向您的应用程序注入额外的功能(请参阅我们(PreEmptive 的)关于运行时智能的博客文章

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

于 2009-07-16T14:34:16.463 回答
1

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

于 2015-08-10T23:28:27.823 回答