27

我在 Visual Studio 2010 中的代码合同工作正常,但我无法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 的引用——如果我在没有参数的情况下运行它,它会适当地失败(但如果它被重写,错误消息没有像我预期的那样被填写)
  • 使用后置条件和不变量没有区别

我试过调高警告和冗长,但这根本没有帮助我做错了什么?

(也在代码合同论坛中作为问题提出。我将自己在这里添加任何相关答案。)

4

1 回答 1

19

好的,这个问题已经在 MSDN 论坛中回答了。这一次,并不是我真的完全愚蠢——这是真的可以用警告来做的事情。

阅读论坛帖子以获取全部详细信息,但基本问题是ccrewrite找不到合同类:它正在寻找 .NET 3.5 CLR 版本mscorlib而不是 .NET 4.0 版本。

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

> ccrewrite /o:rewrittendummy.exe dummy.exe 
  /libpaths:%SystemRoot%\Microsoft.Net\Framework\v4.0.20506
于 2009-07-31T06:26:54.600 回答