Visual Studio Express 2013中的代码合同支持

11
我一直在使用Visual Studio Express 2013进行C#项目开发,期间接触到了.NET语言的代码契约。由于其简洁性以及附带的静态分析工具给我留下深刻印象,因此开始在自己的代码库中使用它们。但是,当我尝试运行程序时,遇到了与这个SO线程中相似的错误消息:

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

指南表明,要解决此问题,必须从项目的属性页面启用代码契约,但在Express版本中无法找到Code Contracts属性条目。

一些MSDN论坛线程似乎表明,Code Contracts的所有工具都包含在Express版本中,但Code Contracts属性页却没有。这似乎是事实,因为我只有在使用我从母校获得的Visual Studio 2012 Ultimate副本启用Code Contracts后,才能在VSE 2013中运行我的项目。

除了手动修改项目文件或使用付费版Visual Studio外,是否真的没有其他方法在Visual Studio Express中使用Code Contracts?如果是这样,我非常犹豫是否要使用它们,因为我的公司不太可能购买VS许可证。此外,微软试图推广这种新的和优越的验证范式,但却将其限制在仅付费客户中,这似乎极为奇怪。


如果可以通过修改项目文件来启用它们,那么说需要付费的VS许可证并不正确。我不知道你问题的答案,但我很想听听结论。 - recursive
@recursive 在 Express 中保留 Code Contracts 的所有库和工具,但需要你支付项目属性菜单项的费用来启用它们,这让我感到困惑。手动编辑机器生成的项目文件并不实际,因为这不是 IDE 的初衷吧? - Matt Kline
3
@MattKline:我从未使用过VS Express。你的意思是,Express版本中缺少Code Contracts项目属性页面?如果是这样,那真的很愚蠢。 - Dennis
它是机器生成的,但我的经验是它会保留你对其所做的更改。 - recursive
2
有些插件是不受支持的,而代码合同属性页是一种不受支持的插件类型,在VS Express中无法使用。这非常不幸,因为相比完整版的VS,Express更加轻便易用... - Schalk
显示剩余3条评论
3个回答

6
你可以使用新的VS Community 2013,只要满足许可要求: http://www.visualstudio.com/en-us/visual-studio-community-vs 以下是Visual Studio Community的使用方式:
在组织内,无限数量的用户可以在课堂学习环境、用于学术研究或为开源项目做贡献的情况下使用Visual Studio Community。 对于所有其他使用场景: 在非企业组织中,最多5个用户可以使用Visual Studio Community。 在企业组织中(指拥有>250台PC或> $1百万美元年收入的组织),除上述开源、学术研究和课堂学习环境情况外,不允许任何使用。
它基本上相当于免费的VS 2013专业版,因此您可以安装代码合同扩展。

5
问题出在你的Visual Studio版本上。正如你所说,你正在运行Visual Studio 2013 Express版本。为了在Visual Studio中使用二进制重写器,你需要安装Code Contracts扩展程序。你可以从微软软件工程研究(RiSE)网站下载这些扩展程序,它们被打包成一个Windows安装程序。
安装程序会安装所需的二进制重写器以及一堆Visual Studio扩展程序。不幸的是,Code Contracts在他们的手册第40页manual中说明,他们不支持各种Visual Studio Express版本。为了在Visual Studio中使用Code Contracts二进制重写器扩展程序,并在项目属性窗口中看到Code Contracts选项卡,你至少需要拥有Visual Studio 2013专业版。
Code Contracts在构建后作为一个步骤进行程序集重写。这意味着,Visual Studio首先按照正常方式编译.NET代码。但是,当使用Code Contracts并在项目上启用正确的选项(假设安装了VS扩展程序-这在Express版本中无法完成)时,二进制重写器会在正常编译过程后由Visual Studio自动调用。
相反,在编译程序之后,您需要手动运行由Code Contracts安装的ccrewrite程序来“重写”编译的程序集(以及所有相关程序集),以添加所有的Code Contract检查信息。有关如何执行此操作的信息,请参阅Code Contracts文档(也可在RiSE网站上找到)。

1
你肯定可以在Express版本中安装VS扩展,虽然我知道你可以手动运行“ccrewrite”,但这只会给同事在为该项目设置环境时增加更多的痛苦。令人失望的是,微软通过只让付费客户轻松使用代码合同来削弱了它的功能。 - Matt Kline
1
@MattKline 你也许可以安装插件。插件与扩展是完全不同的两个东西。也许这就是你想说的? - fourpastmidnight
1
我指的是您可以通过工具->扩展和更新安装的扩展。如果您将它们称为"附加组件",我在Visual Studio或任何最近的Microsoft页面中都没有看到任何涉及它们的语言。此外,说我的店"应该能够承担专业版"完全没有理解我的观点。 - Matt Kline
1
无论如何,一旦在Visual Studio的付费版本中启用了代码合同(我所拥有的Pro 2012的副本),VS 2013 Express成功构建了该项目。这意味着VS 2013 Express具有代码合同支持,但将其隐藏了起来。 - Matt Kline
@MattKline 如果你查看以下几个链接: https://en.wikipedia.org/wiki/Microsoft_Visual_Studio_Express#Extensibility https://dev59.com/h2sz5IYBdhLWcg3wYGoz http://visualstudiomagazine.com/articles/2014/05/21/no-extensions-for-visual-studio-express.aspx 你会发现在 Express 版本中不允许使用第三方扩展。这是 Express 版本和其他版本之间的区别。 - uygar.raf
显示剩余3条评论

3

合同在Visual Studio Express 2013中应该是无用的(至少Code Contracts附带了非Express版本的插件)。

因此,必须在项目属性 -> 构建 -> 一般 -> 条件编译符号中定义符号CONTRACTS_FULL

然后,在项目属性 -> 构建事件下找到适当的调用ccrewrite.exe的后建事件命令行。命令应设置为类似以下内容:

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

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


对我有用。小心使用“字符。 - Oktay

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接