C# 代码契约生成引用程序集操作

C# 代码契约生成引用程序集操作,c#,code-contracts,C#,Code Contracts,我正在使用代码契约,并试图了解我应该使用哪些构建选项以及何时使用。合同程序集生成选项在项目属性中定义 编码合同->合同参考汇编: 没有 建造 不要建造 有什么想法或建议吗?是的,None和DoNotBuild选项似乎有点奇怪 如果选择“无”并在具有合同的项目中引用库,则会收到警告。 如果选择DoNotBuild,则不会收到警告 当然,只有Build生成一个引用assy,对于.EXE来说,这一切都无关紧要 契约引用程序集是一种特殊的程序集,它保留您在源代码文件中定义的任何代码契约。这是必要的,

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

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

  • 没有
  • 建造
  • 不要建造

有什么想法或建议吗?

是的,None和DoNotBuild选项似乎有点奇怪

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


当然,只有Build生成一个引用assy,对于.EXE来说,这一切都无关紧要

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

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

至于设置,以下是它们的含义:

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

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

  • 如果将设置更改为
    DoNotBuild
    ,则不会生成保留代码约定的引用程序集。如果您不打算在其他任何地方使用此程序集,或者该程序集的所有其他用户都可以访问源代码而不需要引用程序集,请选择此选项。这可能会加快建设一点


但此设置(以及此“参考组件”)的意义是什么?这样您就可以将合同与发布代码分开发货。有些人不希望在发布代码中包含契约,因为实现契约的生成代码的大小可能相当大。因此,我们的想法是,在开发过程中,您希望确保遵守合同。在发布期间,可能没有必要保留该合同代码。因此,作为库的使用者,您只需要将库代码本身与程序一起分发—sans契约,从而减少您的总体程序分发大小。当解决方案中的所有项目都不会使用这些程序集时,将解决方案中的所有项目的合同参考程序集设置为
DoNotBuild
,是否有意义?看起来代码契约在解决方案中是可见的。没有?@orad没有听到你的评论。是的,您可以将它们全部设置为
DoNotBuild
。例如,如果您正在编写NuGet库并希望安装该库的人员查看其中的代码契约,则应启用此功能。如何向使用CC引用程序集生成的项目添加引用?是否要将这两个程序集都添加到引用列表中?@EtienneMaheu如果我没记错的话,CC引用程序集的工作方式与.pdb文件和XML文档文件类似。您只需确保程序集及其CC引用程序集位于同一文件夹中,并且它应该自动工作。因此,假设您有Assembly.dll及其CC引用Assembly.Contracts.dll。您只需像往常一样添加对Assembly.dll的引用,只要Assembly.Contracts.dll文件与Assembly.dll位于同一目录中,代码契约实用程序就会自动获取它。如果不行,请告诉我。