【问题标题】:CodeContracts issue代码合同问题
【发布时间】:2010-11-27 17:19:22
【问题描述】:

你好 我有一个关于 CodeContracts 的小问题。我有一个类库项目,它作为一个具有方法 foo(string s1, string s2); 的类; 在 foo 方法中,我有一个 Contract.Requires(s1 != null)。 因此,如果我理解了我的代码的含义(是的,我刚刚安装了 CodeContracts 并开始使用 :),则该合约将在构建过程和运行时检查 s1 != null 表达式,并抛出 ArgumentException>。 我想测试行为,当我从类 lib 项目中调用 foo(null, "test") 时,设计器会告诉我这个问题,但是当我从 winform 应用程序项目中调用它时,我没有收到任何警告错误列表窗口。那么这是否意味着代码合约只在它们所在的项目中有效,而不是在外部呢? 谢谢

更新


我忘了提到我添加的先决条件在静态分析中不起作用。但是,它们确实会在运行时抛出带有适当消息的 ArgumentException。

【问题讨论】:

    标签: c# visual-studio visual-studio-2010 code-contracts


    【解决方案1】:

    好的,感谢 MS 团队,我找到了问题所在。这种奇怪行为的原因是我的程序集的名称以“.Contracts.dll”结尾。问题是静态分析器不检查名称以该名称结尾的程序集。我重命名了程序集,一切都像魅力一样工作,就像任何其他 MS 产品一样 :)

    【讨论】:

    • 绝对的救命稻草,快把我逼疯了!
    • 谢谢!!如果是这种情况,他们至少需要添加警告或其他内容。在这个问题发生近 5 年后,这个问题只花了我 几个小时...这是我在互联网上发现这种行为的唯一地方。
    【解决方案2】:

    如果您在 winforms 项目中签入了Perform Static Contract Checking,这应该可以工作。如果您想要运行时检查,还要验证在您的类库项目中检查了Perform Runtime Contract Checking

    另外,在您的类库项目中,Contract Reference Assembly 应设置为 Build

    来自代码合同文档:

    如果您的项目包含合约并被其他项目引用,我们强烈建议您在 CodeContracts 的属性选项卡中的合约引用程序集部分下选择构建。

    此合同引用程序集对于使项目中的合同可用于引用项目至关重要。如果不构建合同参考程序集,其他项目无法确定存在哪些合同。

    【讨论】:

    • 感谢andrift 的回复。嗯,我有。我在两个项目中都检查了它们,但它不起作用。消息窗口显示: CodeContracts: Checked 0 assertions。有什么想法吗?
    • 在您的类库项目中,您是否将Contract Reference Assembly 设置为Build
    • 是的,它设置为在类库项目中构建。在 Winform 项目中它设置为 none
    【解决方案3】:

    您没有编写您正在使用的 Visual Studio 版本。 AFAIK Code Cotnract 静态分析仅适用于 VS Premium(即标准和专业是不够的)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-01
      • 1970-01-01
      • 2016-08-28
      • 2021-05-27
      • 1970-01-01
      相关资源
      最近更新 更多