问题 Visual Studio Express 2013中的代码约定支持


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

......一个程序集(可能是“<我的项目>”)必须是   使用代码合同重写二进制重写器(CCRewrite)因为   它调用Contract.Requires和CONTRACTS_FULL符号   定义。删除CONTRACTS_FULL符号的任何显式定义   从您的项目和重建...

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

一些MSDN论坛帖子 似乎表明代码合同的所有工具都包含在Express版本中,但代码合同属性页面不包含在Express版本中。这似乎就是这种情况,因为我能够在VSE 2013中运行我的项目,只有在使用我毕业之前从我的大学获得的Visual Studio 2012 Ultimate的副本启用代码合同之后。

除了通过手动修改项目文件或使用付费版本的Visual Studio修改项目文件外,是否真的无法使用Visual Studio Express中的代码约定?如果是这种情况,我对使用它们非常犹豫,因为我的公司不太可能购买VS许可证。此外,微软将试图扩展这种新的优越的验证范例,然后将其仅限于付费客户,这似乎是非常奇怪的。


11315
2017-07-14 04:08


起源

如果可以通过修改项目文件来启用它们,那么说它需要付费VS许可证并不正确。我不知道你问题的答案,但我很想听听结论。 - recursive
@recursive在快捷方式中保留Code Contracts的所有库和工具,但要求你支付项目属性菜单条目,这样才能让我感到困惑。手动编辑机器生成的项目文件确实不实用 - 首先不是IDE的用途吗? - Matt Kline
@MattKline:我从未使用过VS Express。您是说,Express Edition中缺少代码合同的项目属性页吗?如果是这样,这真的很愚蠢。 - Dennis
是的,这就是我的意思,是的,这真的很愚蠢。 - Matt Kline
某些加载项不受支持且代码契约属性页是(部分)VS Express中不支持的加载项类型。非常不幸的是,因为快递比一个完整的VS版本更“轻松”工作...... - Schalk


答案:


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

以下是Visual Studio社区在组织中的使用方式:

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

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

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


6
2017-12-16 16:44





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

安装程序会安装所需的二进制重写器以及一堆Visual Studio扩展。不幸的是,代码合同在他们的 手册 第40页,他们不支持各种Visual Studio Express版本。您需要至少拥有Visual Studio 2013 Professional版本才能在Visual Studio中使用Code Contracts二进制重写器扩展,并且可以在项目属性窗口中查看Code Contracts选项卡。

代码契约执行程序集重写为 生成后 步。这意味着,Visual Studio首先会像往常一样编译.NET代码。但是,当使用代码约定并在项目上启用正确的选项时(假设安装了VS扩展 - 在Express版本中无法做到),那么在正常编译之后,Visual Studio将为您调用二进制重写器处理。

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


5
2017-07-26 20:42



你当然可以在Express版本中安装VS扩展,虽然我知道你可以运行 ccrewrite手动,它只会给任何同事在为这个项目设置环境时增加更多的痛苦。令人失望的是,微软只会让付费用户轻松使用代码合同。 - Matt Kline
@MattKline阅读快速版的文档。你不能。我知道;我开发了VS扩展。支持最少的VS版本是专业版(注意:我不知道VS2014CTP2是否已更改)。它 可能 可以“手动”安装它们,如果你知道如何(它并不那么难) - 但我不能保证VS会同意加载它们,即使它们被手动复制到磁盘上的正确位置并且正确的注册表项。我认为,如果你是一个开发可售软件的专业开发商,你应该能够负担得起Pro。 - fourpastmidnight
@MattKline但是,您可以安装附加组件。附加组件与扩展名明显不同。也许这就是你在想什么? - fourpastmidnight
我指的是你可以安装的扩展程序 Tools -> Extensions and Updates。如果您将其称为“附加组件”,我在Visual Studio或任何最近的Microsoft页面中都看不到任何语言。此外,说我的商店“应该能够买得起Pro”完全忽略了我的观点。 - Matt Kline
无论如何,一旦在Visual Studio的付费版本(我拥有Pro 2012的副本)中启用了代码合同,VS 2013 Express就成功构建了该项目。这意味着VS 2013 Express 具有 代码合同支持,但已将其隐藏在用户之外。 - Matt Kline


对于Visual Studio Express 2013来说,合同应该是无用的(至少代码合同带有适用于所有非快递版本的插件)。

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

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

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

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


3
2017-10-03 22:21



为我工作。小心“性格 - Oktay