File: NetCoreBuildHost.cs
Web Access
Project: src\src\Workspaces\MSBuild\BuildHost\Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.csproj (Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost)
// 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.
 
#if !NETFRAMEWORK
 
using System.IO;
using System.Linq;
using Microsoft.Build.Locator;
 
namespace Microsoft.CodeAnalysis.MSBuild;
 
internal sealed class NetCoreBuildHost : AbstractBuildHost
{
    public NetCoreBuildHost(BuildHostLogger logger, RpcServer server) : base(logger, server)
    {
    }
 
    protected override MSBuildLocation? FindMSBuild(string projectOrSolutionFilePath, bool includeUnloadableInstances)
    {
        VisualStudioInstance? instance;
 
        // Locate the right SDK for this particular project; MSBuildLocator ensures in this case the first one is the preferred one.
        // The includeUnloadableInstance parameter additionally locates SDKs from all installations regardless of whether they are
        // loadable by the BuildHost process.
        var options = new VisualStudioInstanceQueryOptions
        {
            DiscoveryTypes = DiscoveryType.DotNetSdk,
            WorkingDirectory = Path.GetDirectoryName(projectOrSolutionFilePath),
            AllowAllDotnetLocations = includeUnloadableInstances,
            AllowAllRuntimeVersions = includeUnloadableInstances,
        };
 
        instance = MSBuildLocator.QueryVisualStudioInstances(options).FirstOrDefault();
 
        if (instance != null)
        {
            return new(instance.MSBuildPath, instance.Version.ToString());
        }
 
        Logger.LogCritical("No compatible MSBuild instance could be found.");
 
        return null;
    }
 
    protected override bool IsMSBuildLoaded()
    {
        return MSBuildLocator.IsRegistered;
    }
}
 
#endif