【发布时间】:2014-09-02 15:48:32
【问题描述】:
在过去的几个月里,我一直在为我的公司开发一个副项目,但现在高层认为它非常适合现有产品。
我一直在使用 Microsoft 的代码合同进行静态类型检查(部分是因为我以前没有使用过它们并且渴望学习)来开发辅助项目。
我的问题是,如果我将代码签入到带有合同的代码库中,其他开发人员是否需要安装代码合同工具才能继续开发?我知道他们都没有安装它,而且我是这里的大三学生,所以我怀疑我能否说服他们所有人都接受它。
我使用的是 .Net 4.5,因此包含了代码合同库,但我想知道 Visual Studio 是否会抱怨他们没有在每次构建时使用构建选项中指定的CONTRACTS_FULL 进行构建,或者,如果我在构建选项中留下CONTRACTS_FULL,当另一个开发人员尝试构建时会发生什么?此外,我想知道当合同失败时最终产品将如何运作,但代码尚未使用 Code Contracts Rewriter 构建。
我只用一个项目创建了一个新的解决方案。创建了一个触发代码合约违规的简单函数,其中代码合约已卸载,CONTRACTS_FULL 未指定。构建并运行它并收到以下错误:
Run-time exception (line 8): An assembly (probably "hdxticim") must be rewritten using the code contracts binary rewriter (CCRewrite) because it is calling Contract.Requires<TException> and the CONTRACTS_FULL symbol is defined. Remove any explicit definitions of the CONTRACTS_FULL symbol from your project and rebuild. CCRewrite can be downloaded from http://go.microsoft.com/fwlink/?LinkID=169180.
After the rewriter is installed, it can be enabled in Visual Studio from the project's Properties page on the Code Contracts pane. Ensure that "Perform Runtime Contract Checking" is enabled, which will define CONTRACTS_FULL
我认为错误消息需要重写,因为绝对没有指定 CONTRACTS_FULL。
感谢 Matías Fidemraizer,我们发现在使用 Contract.Requires<TException>() 而不是 Contract.Requires() 时会发生这种情况。
理想情况下,我想修改此行为,以便合约触发提供的异常,就好像它是正常的保护语句一样,而不是抱怨重写器。
【问题讨论】:
-
我完全不明白这个问题。此类未安装 CC 的开发人员不会编译整个解决方案 with 合同。合同将被忽略,构建的结果将没有合同。
-
我收到一个错误
Code contracts rewriter has not been run on this project, but it specifies CONTRACTS_FULL...,抱怨如果合约是在没有安装工具的情况下构建的,合约没有被合约重写器重写。相反,我宁愿它抛出我的Contract.Requires<ExceptionType>调用中指定的异常。我只能假设我的团队的其他成员会注意到这一点,并且它必须由我构建才能最终发布。 -
如果您没有 CC VS 扩展,CC 将无法编译。
Contract类自 4.0 起包含在 .NET Framework 中,但在未安装 CC 的情况下会被绕过。 -
有没有办法让它不编译合约,而是在合约失败时抛出异常而不是上面的重写错误?也许使用 Contract 子类?
-
不,如果不执行 CC 编译器,则不会编译合约,因此它们不会在执行期间命中:\
标签: c# .net-4.5 development-environment code-contracts