Skip to content
This repository has been archived by the owner on Jul 15, 2023. It is now read-only.

Visual Studio 2017 support #451

Open
1 of 6 tasks
yaakov-h opened this issue Jul 26, 2016 · 18 comments
Open
1 of 6 tasks

Visual Studio 2017 support #451

yaakov-h opened this issue Jul 26, 2016 · 18 comments

Comments

@yaakov-h
Copy link
Contributor

yaakov-h commented Jul 26, 2016

What needs to be done to add support for VS15, however preliminary.

At minimum we need MSBuild targets for v15.0 (C:\Program Files (x86)\Microsoft\Contracts\MsBuild).

What would I need to modify to add such targets to the project?

  • MSBuild targets for MSBuild 15.0 (Add MSBuild targets for VS2017 #482)
  • Plugin / Project Preferences sheet
  • Code Snippets
  • ITaskManager for background static analysis
  • Tests?
  • Anything else?
@yaakov-h
Copy link
Contributor Author

@tom-englert
Copy link
Contributor

I had to setup a build server with VS15 for evaluation.
The only thing needed to get it run was to copy
C:\Program Files (x86)\MSBuild\14.0\Microsoft.Common.Targets\ImportAfter\CodeContractsAfter.targets
to
C:\Program Files (x86)\MSBuild\15.0\Microsoft.Common.Targets\ImportAfter\CodeContractsAfter.targets

Of course you don't get the CC settings page in the project properties, but it's sufficient to try out existing solutions

@yaakov-h
Copy link
Contributor Author

That works for me too, though I haven't tried CC with any of the new C#7 features yet.

I think the settings pane should show up if you run the MSI after installing VS15. If not, there's a breaking change somewhere in VS.

@patroza
Copy link

patroza commented Dec 14, 2016

Location since recent builds seem to be
:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\15.0\Microsoft.Common.targets\ImportAfter
(depending on edition)

@takinosaji
Copy link

takinosaji commented Mar 7, 2017

@patroza doesnt work in release version. Pathes from post of @yaakov-h work

@yaakov-h yaakov-h changed the title Visual Studio 2017 (RC) support Visual Studio 2017 support Mar 8, 2017
@mmusaev
Copy link

mmusaev commented Mar 10, 2017

Does this mean that Code Contracts will be supported in Visual Studio 2017 soon?

@patroza
Copy link

patroza commented Mar 10, 2017

@takinosaji I've decided to move on and not have this headache at every new VS version :)

@yaakov-h
Copy link
Contributor Author

@mmusaev Depends what you mean by "supported", and if anyone's left alive here to merge #482.

@mmusaev
Copy link

mmusaev commented Mar 11, 2017

I meant by support if Code Contract would be integrated into Visual Studios 2017 Settings Tab.

@yaakov-h
Copy link
Contributor Author

yaakov-h commented Mar 11, 2017 via email

@mmusaev
Copy link

mmusaev commented Mar 12, 2017

Would it be possible to ask for help from Microsoft/Research lab on this?

@tom-englert
Copy link
Contributor

@yaakov-h PR #482 makes it work at least at compile time, however if static analysis is active I always see CodeContracts: Task manager is unavailable (unable to run in background). in the output, and the build takes forever since it has to wait for CC. Did you experience the same behavior?

@yaakov-h
Copy link
Contributor Author

@tom-englert the task manager appears to be provided by Code Contracts' Microsoft.VisualStudio.CodeTools plugin, which was part of the too-hard basket.

As I understand it, all the Visual Studio extension-y bits would need to be packages as a VSIX, rather than the MSI dumping DLLs all over the place and writing to Visual Studio's registry.

@tom-englert
Copy link
Contributor

I see, so probably it's easier to turn on CC only temporary, than to try fixing this...

@yaakov-h
Copy link
Contributor Author

Probably. I actually run cccheck completely out-of-band (see #459) so I didn't really notice.

@Mzangwe
Copy link

Mzangwe commented Apr 24, 2018

This works out of the box in Visual Studio 2017. It is past of the System.Diagnostics.Contracts namespace. See example below:

Contract.Requires<ArgumentNullException>(amount > 0, "Amount to deposit must be positive.");

@coldacid
Copy link

@Mzangwe While System.Diagnostics.Contracts types are in place in the class library itself, the rewriting tools needed to make use of this data aren't integrated with Visual Studio 2017. You can put in all the Contract statements you want in your code, and none of them will have any effect at runtime because the assemblies weren't rewritten to actually check pre- and post-conditions or invariants.

@Mzangwe
Copy link

Mzangwe commented Apr 25, 2018

@coldacid Chris, I used the exact Code Contract in both Debug and Release. They both fail when adding a negative deposit amount.

I added these in the .csproj below

<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>

Then for the Release Condition:

<CodeContractsRuntimeCheckingLevel>ReleaseRequires</CodeContractsRuntimeCheckingLevel>

They App breaks in whichever mode. This then come very handy with Automated Tests even for the PROD stuff. I added CodeContracts.MSBuild Nuget Package for my automated build pipelines.

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

No branches or pull requests

7 participants