代码契约:ccrewrite以-1的代码退出?

11

我是新手,第一次接触代码合约。我下载了最新版本的代码合约项目(1.4.40314.1),并开始将其应用于我的项目中。当我在VS2010的“代码合约”选项卡中启用“运行时检查”时,我遇到了以下错误:

Error 1 The command ""C:\Program Files (x86)\Microsoft\Contracts\Bin\ccrewrite" "@Application1ccrewrite.rsp"" exited with code -1.

每次构建该项目时都会出现这个错误,请帮忙解决。


现在对我来说是一个主要问题。每个使用代码合约的项目在VS2010错误窗口中显示相同的错误,并且“Application1ccrewrite.rsp”在输出窗口中找不到,但它确实存在。


我尝试了一切。我安装了两个版本(Pro、Std),但问题仍然存在。请帮忙!


截图


(与http://social.msdn.microsoft.com/Forums/en-US/codecontracts/thread/bdde6f82-da17-4121-9e7a-053e5a7ac417交叉发布) - mafu
@mafutrct,我在 MSDN 上发布了那个问题,因为我在这里没有得到答案。如果您能帮忙解决就请赐教。 - Code0987
我和这个问题一样。我实际上创建了一个空的控制台应用程序,如果勾选了“执行运行时合同检查”,它将无法构建。 - David Neale
@David-Neale 告诉我你修复了吗。自从 30 天以来,我找不到任何解决方案,Code-contracts 开发人员也无法提供帮助。 - Code0987
在我重新格式化电脑后,我再也不会出现这个错误了。 - Code0987
5个回答

2

我也遇到了这个问题。在我的情况下,问题是ccrewrite无法处理网络文件夹中的文件,而需要将项目放在本地硬盘上。


1
有时候,当你的解决方案路径过长时,特别是在有许多项目的情况下,就会出现这种情况。
尝试将其移动到 c:\temp 并构建它,这可能会修复它(当然,如果你需要它在当前文件夹中,则这可能不是一个解决方案)。
我注意到这个 bug 在早期的 CC 版本中存在,现在可能已经被修复了。

1
我曾经遇到过这个问题。引起问题的类库的程序集名称和默认命名空间与目标文件夹中现有的 DLL 同名。我一直在重构我的代码,虽然 CS 文件中的命名空间都已更改为 namespace2,但属性文件中的默认命名空间仍为 namespace1。
当我纠正了这个问题后,所有文件都成功构建了...

0

我不知道你是否和我遇到了同样的问题,但我也看到了这个错误。在我的情况下,我有一个带有switch语句的方法,根据所选的分支,应用不同的要求:

static ITransaction CreateTransaction(
    String transType,
    MyType1 parm1,
    /* Other params unimportant to this example */
    String parm5)
{
    switch (transType) {
        case Transaction.Type.SOME_TRANSFER:
            Contract.Requires<ArgumentNullException>(parm1.Account != null, "Account cannot be null.");
            Contract.Requires<ArgumentException>(!String.IsNullOrWhiteSpace(parm5), "parm5 cannot be null or empty.");

            // Create instance

            return someInst;

        case Transaction.Type.SOME_OTHER_TRANSFER:
            Contract.Requires<ArgumentException>(!String.IsNullOrWhiteSpace(parm1.Type), "Type cannot be null or empty.");
            Contract.Requires<ArgumentException>(!String.IsNullOrWhiteSpace(parm1.Number), "Number cannot be null or empty.");

            // Create instance

            return someInst;

        /* Other cases */

        default:
            throw new ApplicationException("Invalid or unknown transaction type provided.");
    }
}

当我尝试构建时,这给了我你在错误列表中指出的错误。在输出窗口中,我得到了以下内容:

EXEC : 引用程序集生成器警告:方法'TerraCognita.LoanExpress.Domain.Loan.CreateLoanTransaction'中的合同编号1存在问题。AsmMeta由于未捕获的异常而失败:由于对象的当前状态无效,操作无效。

我将每个分支推入自己的方法中,使Contract.Requires成为每个方法中的第一行代码,然后我就不再有编译问题了。看起来Contract.Requires必须是方法中的第一行代码-这很有道理,因为它们旨在用于定义前置条件。

希望这可以帮助到您。


3
有充分的文献证明,.Requires 和 .Ensures 必须在方法中排在第一位(在任何遗留需求之后)。 - H H
我并不是说这没有记录。(我毫不怀疑它一定在我审查的文档中,而我忽略了它。)我是说,如果你这样做,你会看到帖子中提到的错误。 - Remi Despres-Smyth
但这不是问题所在。当你启用“运行时检查”时,无论你是否编写CodeContract代码,都会出现错误。 - Code0987
@neeraj:但是Remi的回答确实表明你需要发布一些代码示例。你所有的Req/Ens调用都在方法的顶部吗? - H H
@Henk Holterman 是的,您说得对。我总是保持它们在最上面。但是我想说这不是问题所在。 - Code0987

0
解决方案是将前置条件和后置条件放在第一行。ccrewrite不接受前置条件和后置条件在命令行下面的情况。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接