Visual Studio Express 2013 中的代码协定支持

Posted

技术标签:

【中文标题】Visual Studio Express 2013 中的代码协定支持【英文标题】:Code Contracts support in Visual Studio Express 2013 【发布时间】:2014-07-14 04:08:38 【问题描述】:

我一直在 Visual Studio Express 2013 中开发 C# 项目,遇到了用于 .NET 语言的 Code Contracts。他们的简洁性和附带的静态分析工具给我留下了深刻的印象,我开始在我的代码库中使用它们。但是,当我尝试运行我的程序时,遇到了一条类似于 this SO thread 中的错误消息,即

...一个程序集(可能是“”)必须是 使用代码契约二进制重写器 (CCRewrite) 重写,因为 它正在调用 Contract.Requires 并且 CONTRACTS_FULL 符号是 定义。删除 CONTRACTS_FULL 符号的任何显式定义 从您的项目中重建...

指南建议要解决此问题,我必须从项目的“属性”页面启用代码契约,但在 Express 中找不到代码契约属性条目。

Some MSDN forum threads 似乎表明所有代码合同工具都包含在 Express 版本中,但代码合同属性页面没有。情况似乎是这样,因为我只有在使用毕业前从大学获得的 Visual Studio 2012 Ultimate 副本启用代码合同后才能在 VSE 2013 中运行我的项目。

除了手动修改项目文件或使用 Visual Studio 的付费版本之外,是否真的无法在 Visual Studio Express 中使用代码协定?如果是这种情况,我会非常犹豫是否要使用它们,因为我的公司不太可能购买 VS 许可证。此外,微软试图推广这种新的、卓越的验证范式,但随后将其仅限于付费客户,这似乎非常奇怪。

【问题讨论】:

如果可以通过修改项目文件来启用它们,那么说它需要付费的 VS 许可证是不正确的。我不知道你的问题的答案,但我很想知道结论。 @recursive 将代码合同的所有库和工具留在 Express 中,但要求您为启用它们的项目属性菜单条目付费,这让我感到困惑。手动编辑机器生成的项目文件确实不切实际 - 这不正是 IDE 的初衷吗? @MattKline:我从未使用过 VS Express。您的意思是,Express Edition 中没有项目的代码合同属性页吗?如果是这样,这真的很愚蠢。 是的,这就是我的意思,是的,这真的很愚蠢。 某些插件不受支持,代码合同属性页是(部分)VS Express 不支持的插件类型。非常不幸,因为 express 比完整的 VS 版本更“轻”... 【参考方案1】:

只要满足许可要求,您就可以使用新的 VS Community 2013: http://www.visualstudio.com/en-us/visual-studio-community-vs

Visual Studio Community 在组织中的使用方式如下:

一个 组织内无限数量的用户可以使用 Visual Studio 社区适用于以下场景:在课堂学习 环境,用于学术研究,或为开源做出贡献 项目。

对于所有其他使用场景:在非企业 组织,最多 5 个用户可以使用 Visual Studio Community。在 企业组织(即拥有 > 250 台 PC 或 > 100 万美元的企业) 美元的年收入),不允许使用超出开放 来源、学术研究和课堂学习环境 上述场景。

它基本上是免费的 VS 2013 Professional,因此您可以安装代码合同扩展。

【讨论】:

【参考方案2】:

问题在于您的 Visual Studio 版本。正如您所说,您正在运行 Visual Studio 2013 Express 版本。为了在 Visual Studio 中使用二进制重写器,您需要安装代码协定扩展。这些您可以从 Microsoft 的软件工程研究 (RiSE) 站点下载,该站点打包为 Windows 安装程序。

安装程序会安装所需的二进制重写器,以及一堆 Visual Studio 扩展。不幸的是,代码合同在其第 40 页的manual 中声明它们不支持各种 Visual Studio Express 版本。您至少需要拥有 Visual Studio 2013 专业版才能在 Visual Studio 中使用代码协定二进制重写器扩展,并在项目属性窗口中查看代码协定选项卡。

代码契约将程序集重写作为构建后 步骤执行。这意味着,Visual Studio 首先像往常一样编译 .NET 代码。但是,当使用代码契约并在您的项目中启用正确的选项时(假设已安装 VS 扩展——在 Express 版本中您无法做到这一点),则在正常编译后 Visual Studio 会为您调用二进制重写器过程。

相反,在编译您的程序后,您需要在已编译的程序集(以及所有依赖程序集)上手动运行由 Code Contracts 安装的 ccrewrite 程序以“重新编写”您的程序集,这将添加所有代码合同检查信息。有关如何执行此操作的信息,请参阅代码合同文档(也可在 RiSE 网站上获得)。

【讨论】:

您当然可以在 Express 版本中安装 VS 扩展,虽然我知道您可以手动运行 ccrewrite,但这只会让任何同事在为该项目设置环境时更加痛苦。令人失望的是,微软只会让付费客户易于使用,从而阻碍这样的代码合同。 @MattKline 阅读速成版的文档。你不能。我知道;我开发了 VS 扩展。受支持最少的 VS 版本是专业版(注意:我不知道这是否已随 VS2014CTP2 改变)。 也许可以“手动”安装它们,如果你知道如何(这并不难)——但我不能保证 VS 会同意加载它们,即使它们被手动复制到正确的磁盘上的位置和正确的注册表项。而且我认为,如果您是一家开发可销售软件的专业开发商店,您应该能够负担得起 Pro。 @MattKline 但是,您也许可以安装附加组件。附加组件与扩展明显不同。也许这就是你的想法? 我指的是可以通过Tools -> Extensions and Updates 安装的扩展。如果您将它们称为“附加组件”,我认为在 Visual Studio 或任何最近的 Microsoft 页面中都没有提及它们的语言。此外,说我的商店“应该能买得起 Pro”完全没有我的意思。 无论如何,一旦在 Visual Studio 的付费版本(我拥有的 Pro 2012 的副本)中启用了代码契约,VS 2013 Express 就成功构建了该项目。这意味着 VS 2013 Express 具有 Code Contract 支持,但对用户隐藏了它。【参考方案3】:

对于 Visual Studio Express 2013,Contracts 应该是无用的(至少 Code Contracts 带有一个适用于所有非 express 版本的插件)。

所以必须在项目属性->构建->通用->条件编译符号中定义符号CONTRACTS_FULL

然后将对ccrewrite.exe 的正确调用添加到项目属性-> 构建事件 下的构建后事件命令行。该命令应设置为类似

"C:\Program Files (x86)\Microsoft\Contracts\Bin\ccrewrite.exe" -throwOnFailure "$(TargetPath)"

我今晚成功地将它与 NUnit 一起使用。使用契约,我的单元测试不需要明确检查后置条件。

【讨论】:

为我工作。小心 " 字符

以上是关于Visual Studio Express 2013 中的代码协定支持的主要内容,如果未能解决你的问题,请参考以下文章

Visual Studio 2012 上的计算机错误中缺少 GDAL201.dll

Visual Studio 高级程序在 Visual Studio Express 中打开?

Visual Studio 和 Visual Studio Express 有啥区别?

Visual Studio Express 2013 和 Visual Studio 2013 之间的区别

Visual Studio Express 2013 或 Visual Studio Pro 2010

Visual Studio Express 2012 无法添加到 Visual Studio Team Services 的连接