Nic*_*ell 13 c# development-environment code-contracts .net-4.5
在过去的几个月里,我一直在为我的公司开发一个辅助项目,但是现在已经决定它们在现有产品中是合适的.
我一直在使用微软的代码合同开发侧面项目进行静态类型检查(部分原因是我之前没有使用它们并且渴望学习).
我的问题是,如果我将代码签入到代码库中,并且所有其他开发人员都需要安装代码合同工具才能继续开发吗?我知道有一个事实,他们都没有安装它,我在这里是初级,所以我怀疑我能说服他们所有人接受它.
我正在使用.Net 4.5,因此包含了代码契约库,但我想知道Visual Studio是否会抱怨他们CONTRACTS_FULL每次构建时都没有使用构建选项中指定的构建,或者,如果我离开CONTRACTS_FULL在构建选项中,当另一个开发人员尝试构建时会发生什么?此外,我想知道当合同失败时最终产品将如何行动,但代码尚未使用代码合同重写器构建.
我只用一个项目创建了一个新的解决方案.创建了一个简单的函数,它触发了代码合同违规,卸载了代码契约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
Run Code Online (Sandbox Code Playgroud)
我认为错误消息需要重写,因为绝对没有指定CONTRACTS_FULL.
感谢MatíasFidemraizer,我们已经发现这种情况发生在使用Contract.Requires<TException>()而不是使用时Contract.Requires().
理想情况下,我想修改此行为,以便合同触发提供的异常,就好像它是一个普通的保护声明,而不是抱怨重写器.
简短的回答是:是的。如果您使用代码契约签入代码,则可能构建该代码的所有开发人员也必须安装代码契约才能构建代码。
与 @CBauer 在他的回答中所写的相矛盾的是,代码契约有一个“blessed”包。不,它不是 NuGet 包,而是基于 MSI 安装程序的安装。
最后,如果您处于调试构建的持续集成环境中(例如开发、QA/QC 和/或测试),那么这些构建服务器还需要安装代码契约。
当您使用代码契约时,调试构建始终需要使用代码契约。请注意,发布版本不一定是这种情况。这取决于您使用的合同检查形式以及项目属性中指定的选项。
代码合同手册包含所有详细信息。它非常好,我强烈建议您花时间阅读和理解它。
应该注意的是,如果您使用Contract.Requires<TException>(bool condition)先决条件的形式,则必须为发布版本启用代码契约(请参阅第 5 节:使用指南,特别是第 20 页,使用 2场景)。
由于您要将此代码集成到尚未使用代码合约开发的现有代码库中,因此您应该考虑修改代码合约项目属性设置以符合代码合约手册第 20 页上概述的使用场景 3,并使用“遗留”的 if-then- throw 模式。这将使您的团队能够最好地将代码库转换为在任何地方使用代码契约,从而使您最终能够用实际的代码契约检查(如果您愿意的话)替换“旧版”if-then- throw 前提条件检查。Contract.Requires(bool condition)Contract.Requires<TException>(bool condition)
更新:很快就会有一个代码合约的 NuGet 包 我今天在新的代码合约 GitHub 存储库中。对于那些不知道的人来说,微软已经将其开源,并且现在是社区驱动的工作。
他们最近(一月份)宣布发布v1.10.xxxx.RC1。您可以在他们的 GitHub 存储库上找到有关它的信息。