File: Utilities\VisualStudioMSBuildInstalled.cs
Web Access
Project: ..\..\..\src\Workspaces\MSBuildTest\Microsoft.CodeAnalysis.Workspaces.MSBuild.UnitTests.csproj (Microsoft.CodeAnalysis.Workspaces.MSBuild.UnitTests)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
 
using System;
using Microsoft.Build.Locator;
using Roslyn.Test.Utilities;
 
namespace Microsoft.CodeAnalysis.MSBuild.UnitTests
{
    internal class VisualStudioMSBuildInstalled : ExecutionCondition
    {
#if NET472_OR_GREATER

        private static readonly VisualStudioInstance? s_instance;
        private readonly Version _minimumVersion;
 
        static VisualStudioMSBuildInstalled()
        {
            var latestInstalledInstance = (VisualStudioInstance?)null;
            foreach (var visualStudioInstance in MSBuildLocator.QueryVisualStudioInstances())
            {
                if (latestInstalledInstance == null || visualStudioInstance.Version > latestInstalledInstance.Version)
                {
                    latestInstalledInstance = visualStudioInstance;
                }
            }
 
            if (latestInstalledInstance != null)
            {
                MSBuildLocator.RegisterInstance(latestInstalledInstance);
                s_instance = latestInstalledInstance;
            }
        }
 
#endif
 
        public VisualStudioMSBuildInstalled()
            : this(new Version(17, 0))
        {
        }
 
        internal VisualStudioMSBuildInstalled(Version minimumVersion)
        {
#if NET472_OR_GREATER
            _minimumVersion = minimumVersion;
#endif
        }
 
        public override bool ShouldSkip
#if NET472_OR_GREATER
            => s_instance is null || s_instance.Version < _minimumVersion;
#else
            => true;
#endif
 
        public override string SkipReason
#if NET472_OR_GREATER
            => $"Could not locate Visual Studio with MSBuild {_minimumVersion} or higher installed";
#else
            => $"Test runs on .NET Framework only.";
#endif
    }
}