【问题标题】:Code contracts build reference assembly actions代码契约构建参考组装动作
【发布时间】:2014-09-16 07:57:20
【问题描述】:

我正在使用代码合同并试图了解我应该使用哪些构建选项以及何时使用。合同程序集构建选项在项目属性中定义

代码合同 -> 合同参考汇编

  • 构建
  • 不构建

有什么想法或建议吗?

【问题讨论】:

    标签: c# code-contracts


    【解决方案1】:

    合同参考程序集是一种特殊的程序集,它保留您在源代码文件中定义的任何代码合同。这是必要的,因为在编译时,代码合约的“重写器”(ccrewriter)会删除每个合约或用等效的验证码替换每个合约(Contract.Requires(someBool) 可能会重写为if (!someBool) throw)。

    如果没有代码协定,如果您稍后在不同的解决方案中引用已编译的程序集(而不是项目及其所有源代码文件),它可能不知道任何代码协定。如果创建了合同参考程序集,IDE 可以在静态分析期间考虑该程序集中的任何合同。

    至于设置,它们的意思是:

    • (none) 表示您尚未进行选择,因此不会创建参考程序集。如果另一个程序集依赖于这个程序集并且您已为其选择了Build,您可能会收到“未找到合同参考程序集”的错误/警告。

    • 如果您将设置更改为Build,将创建一个包含所有合同的参考程序集。您将能够使用该程序集中定义的所有代码协定,就像您拥有源代码一样。如果您正在创建将由第三方(例如 NuGet 包)或任何人在程序集编译后使用的库,请选择此选项,这样他们将受益于您的静态代码合同分析。

    • 如果您将设置更改为 DoNotBuild,则不会生成任何参考程序集,以保留您的代码协定。如果您不打算将此程序集用于其他任何地方,或者如果该程序集的所有其他用户都可以访问源代码并且不需要参考程序集,请选择此选项。它可能会加快构建速度。

    【讨论】:

    • 当解决方案中的所有程序集都不会用于该解决方案时,将解决方案中的所有项目的合同参考程序集设置为DoNotBuild 是否有意义?无论如何,看起来代码合同在解决方案中都是可见的。没有?
    • @orad 错过了您的评论。是的,您可以将它们全部设置为DoNotBuild。仅当您正在编写 NuGet 库并希望安装它的人看到其中的代码合同时,才应启用此功能。
    • 如何添加对使用 CC 引用程序集构建的项目的引用?您是否应该将这两个程序集都添加到您的参考列表中?
    • @EtienneMaheu 如果我没记错的话,CC 引用程序集就像 .pdb 文件XML 文档文件 一样工作。您只需确保程序集及其 CC 参考程序集在同一个文件夹中,并且它应该会自动运行。因此,假设您有 Assembly.dll 及其 CC 参考程序集 Assembly.Contracts.dll。您只需像往常一样添加对 Assembly.dll 的引用,只要 Assembly.Contracts.dll 文件与 Assembly.dll 文件位于同一目录中i>,代码合同实用程序将自动拾取它。如果这不起作用,请告诉我。
    【解决方案2】:

    是的,None 和 DoNotBuild 选项看起来有点奇怪。

    如果您选择“无”并在带有合同的项目中引用该库,您将收到警告。
    如果您选择 DoNotBuild,您将不会收到警告。

    当然,只有 Build 会产生参考组件,对于 .EXE 来说,这一切都无关紧要。

    【讨论】:

    • 但是这个设置(以及这个“参考程序集”)有什么意义呢?
    • 这样您就可以将合同与发布代码分开发送。有些人不想要发布代码中的合约,因为执行合约的生成代码的大小可能非常大。因此,想法是,在开发过程中,您要确保遵守合同。在发布期间,可能不需要保留该合约代码。因此,作为库的使用者,您只需将库代码本身与您的程序一起分发——无合约,从而减少您的整体程序分发规模。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-20
    相关资源
    最近更新 更多