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

Jon*_*eet 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

> ccrewrite /o:RewrittenDummy.exe Dummy.exe
elapsed time: 61ms
Run Code Online (Sandbox Code Playgroud)

RewrittenDummy.exe之后没有文件.

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

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

我已经尝试过警告和冗长,这根本没有帮助我做错了什么?

(也是代码合同论坛中的一个问题.我会在这里添加任何相关的答案.)

Jon*_*eet 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
Run Code Online (Sandbox Code Playgroud)