为什么ccrewrite.exe没有从命令行做任何事情?

时间:2009-07-30 20:31:27

标签: .net-4.0 code-contracts ccrewrite

我从Visual Studio 2010中获得了Code Contracts正常工作,但我不能让ccrewrite.exe从命令行做任何有用的事情。这是一个示例应用程序:

using System.Diagnostics.Contracts;

public class Dummy
{
    public static void Main(string[] args)
    {
        Contract.Requires(args.Length > 0);
    }
}

然后我编译代码并在其上运行ccrewrite.exe:

> csc /debug+ /D:CONTRACTS_FULL Dummy.cs

> ccrewrite /o:RewrittenDummy.exe Dummy.exe
elapsed time: 61ms

之后没有RewrittenDummy.exe文件。

我尝试了很多选项,但没有任何区别。我注意到的一些事情:

  • 它肯定会加载Dummy.exe,因为如果我指定一个不存在的文件,它就会死掉
  • Dummy.exe肯定包含对Contract的引用 - 如果我在没有参数的情况下运行它,它会正确地失败(但是如果它已被重写,则错误消息没有被填写)
  • 使用后置条件和不变量没有区别

我尝试过警告和冗长,但这根本没有用 我做错了什么?

(也以question in the Code Contracts forum的形式提问。我将在此自行添加相关答案。)

1 个答案:

答案 0 :(得分:19)

好的,这是answered in the MSDN forum。这一次,我真的不是完全愚蠢 - 这是一个可以用警告做的事情。

阅读论坛帖子了解完整的详细信息,但基本问题是ccrewrite无法找到合同类:它正在查看.NET 3.5 CLR版本的mscorlib而不是。{ NET 4.0一个。

这可以通过明确列出相关程序集的路径来解决:

> ccrewrite /o:rewrittendummy.exe dummy.exe 
  /libpaths:%SystemRoot%\Microsoft.Net\Framework\v4.0.20506