【发布时间】:2014-09-16 07:57:20
【问题描述】:
我正在使用代码合同并试图了解我应该使用哪些构建选项以及何时使用。合同程序集构建选项在项目属性中定义
代码合同 -> 合同参考汇编:
- 无
- 构建
- 不构建
有什么想法或建议吗?
【问题讨论】:
标签: c# code-contracts
我正在使用代码合同并试图了解我应该使用哪些构建选项以及何时使用。合同程序集构建选项在项目属性中定义
代码合同 -> 合同参考汇编:
有什么想法或建议吗?
【问题讨论】:
标签: c# code-contracts
合同参考程序集是一种特殊的程序集,它保留您在源代码文件中定义的任何代码合同。这是必要的,因为在编译时,代码合约的“重写器”(ccrewriter)会删除每个合约或用等效的验证码替换每个合约(Contract.Requires(someBool) 可能会重写为if (!someBool) throw)。
如果没有代码协定,如果您稍后在不同的解决方案中引用已编译的程序集(而不是项目及其所有源代码文件),它可能不知道任何代码协定。如果创建了合同参考程序集,IDE 可以在静态分析期间考虑该程序集中的任何合同。
至于设置,它们的意思是:
(none) 表示您尚未进行选择,因此不会创建参考程序集。如果另一个程序集依赖于这个程序集并且您已为其选择了Build,您可能会收到“未找到合同参考程序集”的错误/警告。
如果您将设置更改为Build,将创建一个包含所有合同的参考程序集。您将能够使用该程序集中定义的所有代码协定,就像您拥有源代码一样。如果您正在创建将由第三方(例如 NuGet 包)或任何人在程序集编译后使用的库,请选择此选项,这样他们将受益于您的静态代码合同分析。
如果您将设置更改为 DoNotBuild,则不会生成任何参考程序集,以保留您的代码协定。如果您不打算将此程序集用于其他任何地方,或者如果该程序集的所有其他用户都可以访问源代码并且不需要参考程序集,请选择此选项。它可能会加快构建速度。
【讨论】:
DoNotBuild 是否有意义?无论如何,看起来代码合同在解决方案中都是可见的。没有?
DoNotBuild。仅当您正在编写 NuGet 库并希望安装它的人看到其中的代码合同时,才应启用此功能。
是的,None 和 DoNotBuild 选项看起来有点奇怪。
如果您选择“无”并在带有合同的项目中引用该库,您将收到警告。
如果您选择 DoNotBuild,您将不会收到警告。
当然,只有 Build 会产生参考组件,对于 .EXE 来说,这一切都无关紧要。
【讨论】: