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,您可以使用以下内容解决它:
DotNet.Contracts.1.10.20606.1\MsBuild)v14.0文件夹v15.0一切都应该按预期建立.
目前没有支持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.
代码合同在VS 2017中不起作用的原因是:
当然,有关CodeContracts的未来的问题是有效的,但是您可以实现以下内容,以使使用CodeContracts的现有项目能够在VS 2017中构建:
将的内容添加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文件。
在* .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上提供一个示例。
| 归档时间: |
|
| 查看次数: |
13402 次 |
| 最近记录: |