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

C# 哪些工具执行IL的编译后修改?,c#,postsharp,intermediate-language,C#,Postsharp,Intermediate Language,最近一次提到PostSharp让我想起了这一点: 去年在我工作的地方,我们考虑使用PostSharp将工具注入到代码中。这是在Team Foundation Server团队构建/持续集成环境中进行的。 考虑到这一点,我对PostSharp的操作方式有一种烦人的感觉——它编辑编译器生成的IL。这让我有点烦恼 我并不太担心PostSharp不能正确地完成它的工作;我担心这是我第一次听到这样的工具。我担心其他工具可能没有考虑到这一点 事实上,在我们前进的过程中,我们确实遇到了一些问题,原因是Post

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

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

考虑到这一点,我对PostSharp的操作方式有一种烦人的感觉——它编辑编译器生成的IL。这让我有点烦恼

我并不太担心PostSharp不能正确地完成它的工作;我担心这是我第一次听到这样的工具。我担心其他工具可能没有考虑到这一点

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

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


更新:谢谢您的回答

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

我知道,一个扩展System.Reflection工具集的框架库,项目使用它

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

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

编辑:

  • cccheck是运行后期生成的工具,是在编译时验证契约的静态检查器
  • ccrewrite是运行cccheck后、重写IL并从合同生成运行时检查的工具
(我找不到有关这些工具的任何其他技术信息)


我还没有使用VisualStudio2010,但我已经看到了代码契约特性的演示,它集成到IDE构建过程中。cccheck必须始终运行,如果生成的程序集中存在合同,则返回代码。如果它们存在,代码将表示应该运行ccrewrite。

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

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


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

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

您能详细介绍第二个工具吗?Reflector有一个名为Reflectil()的插件这是基于Mono.Cecil的。