VS2017可以与CodeContracts一起使用吗?

use*_*007 50 code-contracts visual-studio-2017

我刚刚安装了新发布的Visual Studio 2017 Enterprise(RC).但是我无法使用Microsoft CodeContracts.我对使用VS2015的CodeContract没有任何问题.我错过了什么吗?

Jer*_*ney 25

正如其他人所指出的那样,微软没有优先考虑代码合同,其长期支持仍不清楚(尽管已经有一些关于通过Roslyn 进行语言级集成的讨论).

然而,截至2017年3月11日,社区贡献者Yaakov至少更新了源代码以包含Visual Studio 2017构建目标(谢谢!).此版本支持编译期间的静态检查以及使用的运行时验证CCRewrite.

:此版本也不会通过提供配置支持,项目的属性面板.因此,需要通过手动将适当的属性添加到csproj文件来配置代码协定.有关完整的属性列表,请参阅@ crimbo上面的答案.

不幸的是,虽然这些更新已合并到主代码分支中,但它们既未反映在Marketplace分发版中,也未反映在官方NuGet包中.因此,您需要从存储库下载并编译源代码(这很简单;只需使用提供的BuildCC.bat文件).

重要提示:为代码契约静态分析对.NET 3.5的硬编码的依赖性,因此不再默认情况下是Windows 10或Visual Studio 2017年.因此安装时,你要确保这个"功能"已启用(或单独下载); 否则,您将收到编译时错误.

或者,截至2017年6月15日,Igor Bek已将此更新包含在他的NuGet包中,因此最简单的方法是将"CodeContracts.MSBuild"添加到您的packages.configvia:

Install-Package CodeContracts.MSBuild -Version 1.9.10714.3
Run Code Online (Sandbox Code Playgroud)

背景:Igor Bek首先将这个软件包放在一起,作为Code Contracts团队的概念验证,后来成为官方NuGet软件包的基础(在v1.10.10126.2中).由于微软尚未更新官方NuGet包,他现在是最新的.

鉴于目前的支持状态,我不鼓励人们为新项目采用代码合同,但这应该为已经投资到现有.NET Framework项目的代码合同的开发人员提供向后兼容性.


小智 13

在撰写本文时,VS2017没有合约定义,但如果使用Nuget软件包DotNet.Contracts,您可以使用以下内容解决它:

  • 导航到CodeContracts nuget包目录(DotNet.Contracts.1.10.20606.1\MsBuild)
  • 复制v14.0文件夹
  • 将其重命名为 v15.0

一切都应该按预期建立.

  • @user2106007 - 请参阅`@JeremyCaney` 的回答,我安装了 NuGet 包 [CodeContracts.MSBuild](https://www.nuget.org/packages/CodeContracts.MSBuild)。这就是您需要做的全部工作,并编辑 .csproj 文件以指定配置。 (2认同)

Edi*_*din 7

目前没有支持Visual Studio 2017 的Code Contracts for .NET版本.但是,如果您复制以下目标文件,则可以解决该问题

C:\Program Files (x86)\MSBuild\4.0\Microsoft.Common.Targets\ImportAfter\CodeContractsAfter.targets
Run Code Online (Sandbox Code Playgroud)

到VS2017 MSBuild的ImportAfter位置:

C:\Program Files (x86)\Microsoft Visual Studio\2017\#YourVS2017Product#\MSBuild\15.0\Microsoft.Common.targets\ImportAfter
Run Code Online (Sandbox Code Playgroud)

注意:将#YourVS2017Product#替换为上述路径中的VS2017产品名称,例如社区.

这将允许您使用VS2017中的代码约定进行构建,但不能解决未在"项目设置"中显示的CC选项卡的问题.为此,您仍然需要切换到VS2015.


cri*_*mbo 5

代码合同在VS 2017中不起作用的原因是:

  1. VS 2017的msbuild文件树中没有导入代码合同MSBuild文件(易于修复)
  2. VS 2017项目属性中不存在代码协定配置UI(可通过include CodeContracts msbuild属性轻松修复)

当然,有关CodeContracts的未来的问题是有效的,但是您可以实现以下内容,以使使用CodeContracts的现有项目能够在VS 2017中构建:

  1. 将的内容添加C:\Program Files (x86)\MSBuild\14.0\Microsoft.Common.Targets\ImportAfter\CodeContractsAfter.targets到您的csproj文件中(直接或通过导入间接添加)。最基本的方法是将其添加到您的csproj文件中:

    <PropertyGroup>
      <CodeContractsInstallDir Condition="'$(CodeContractsInstallDir)'==''">C:\Program Files (x86)\Microsoft\Contracts\</CodeContractsInstallDir>
    </PropertyGroup>
    <Import Condition="'$(CodeContractsImported)' != 'true' AND '$(DontImportCodeContracts)' != 'true'" Project="$(CodeContractsInstallDir)MsBuild\v$(VisualStudioVersion)\Microsoft.CodeContracts.targets" />
    
    Run Code Online (Sandbox Code Playgroud)

请注意,如果安装了CodeContracts,则不需要第一个PropertyGroup,应将b / c CodeContractsInstallDir指定为环境变量。在这种情况下,只需添加

<Import Condition="'$(CodeContractsImported)' != 'true' AND '$(DontImportCodeContracts)' != 'true'" Project="$(CodeContractsInstallDir)MsBuild\v$(VisualStudioVersion)\Microsoft.CodeContracts.targets" />
Run Code Online (Sandbox Code Playgroud)

到您的* .csproj文件。

  1. 在* .csproj文件中指定所有CodeContracts属性(直接或通过导入间接)。例如:

    <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    
    <!-- Code Contracts settings -->
    <PropertyGroup>
      <CodeContractsAssemblyMode>1</CodeContractsAssemblyMode>
      <CodeContractsEnableRuntimeChecking>True</CodeContractsEnableRuntimeChecking>
      <CodeContractsRuntimeOnlyPublicSurface>False</CodeContractsRuntimeOnlyPublicSurface>
      <CodeContractsRuntimeThrowOnFailure>True</CodeContractsRuntimeThrowOnFailure>
      <CodeContractsRuntimeCallSiteRequires>False</CodeContractsRuntimeCallSiteRequires>
      <CodeContractsRuntimeSkipQuantifiers>False</CodeContractsRuntimeSkipQuantifiers>
      <CodeContractsRunCodeAnalysis>False</CodeContractsRunCodeAnalysis>
      <CodeContractsNonNullObligations>False</CodeContractsNonNullObligations>
      <CodeContractsBoundsObligations>False</CodeContractsBoundsObligations>
      <CodeContractsArithmeticObligations>False</CodeContractsArithmeticObligations>
      <CodeContractsEnumObligations>False</CodeContractsEnumObligations>
      <CodeContractsRedundantAssumptions>False</CodeContractsRedundantAssumptions>
      <CodeContractsInferRequires>False</CodeContractsInferRequires>
      <CodeContractsInferEnsures>False</CodeContractsInferEnsures>
      <CodeContractsInferObjectInvariants>False</CodeContractsInferObjectInvariants>
      <CodeContractsSuggestAssumptions>False</CodeContractsSuggestAssumptions>
      <CodeContractsSuggestRequires>True</CodeContractsSuggestRequires>
      <CodeContractsSuggestEnsures>False</CodeContractsSuggestEnsures>
      <CodeContractsSuggestObjectInvariants>False</CodeContractsSuggestObjectInvariants>
      <CodeContractsDisjunctiveRequires>False</CodeContractsDisjunctiveRequires>
      <CodeContractsRunInBackground>True</CodeContractsRunInBackground>
      <CodeContractsShowSquigglies>False</CodeContractsShowSquigglies>
      <CodeContractsUseBaseLine>False</CodeContractsUseBaseLine>
      <CodeContractsEmitXMLDocs>True</CodeContractsEmitXMLDocs>
      <CodeContractsCacheAnalysisResults>True</CodeContractsCacheAnalysisResults>
      <CodeContractsRuntimeCheckingLevel>Full</CodeContractsRuntimeCheckingLevel>
      <CodeContractsReferenceAssembly>Build</CodeContractsReferenceAssembly>
      <CodeContractsAnalysisWarningLevel>0</CodeContractsAnalysisWarningLevel>
    </PropertyGroup>
    
    <PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
    </PropertyGroup>
    
    <PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
      <CodeContractsRuntimeCheckingLevel>ReleaseRequires</CodeContractsRuntimeCheckingLevel>
    </PropertyGroup>
    
    </Project>
    
    Run Code Online (Sandbox Code Playgroud)

如果您有多个项目,建议您将它们放在私有的nuget程序包中,并在每个项目中引用该nuget程序包。代码合同设置(来自步骤2)可以进入mycompany.codecontracts.props文件,代码合同目标(来自步骤1)可以进入mycompany.codecontracts.targets文件。

有关在nuget程序包中打包msbuild属性/目标的更多信息,请访问:https ://docs.microsoft.com/zh-cn/nuget/create-packages/creating-a-package#includes-msbuild-props-and-targets- 包装内

如果有足够的兴趣,我愿意在GitHub上提供一个示例。