Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ public sealed class DotNetMSBuildSdkResolver : SdkResolver
private readonly Func<string>? _getCurrentProcessPath;
private readonly Func<string, string, string?> _getMsbuildRuntime;
private readonly NETCoreSdkResolver _netCoreSdkResolver;
private readonly VSSettings _vsSettings;

private const string DOTNET_HOST_PATH = nameof(DOTNET_HOST_PATH);
private const string DotnetHostExperimentalKey = "DOTNET_EXPERIMENTAL_HOST_PATH";
Expand Down Expand Up @@ -86,6 +87,7 @@ public DotNetMSBuildSdkResolver(Func<string, string?> getEnvironmentVariable, Fu
_getCurrentProcessPath = getCurrentProcessPath;
_netCoreSdkResolver = new NETCoreSdkResolver(getEnvironmentVariable, vsSettings);
_getMsbuildRuntime = getMsbuildRuntime;
_vsSettings = vsSettings;

if (_getEnvironmentVariable(EnvironmentVariableNames.DOTNET_MSBUILD_SDK_RESOLVER_ENABLE_LOG) is string val &&
(string.Equals(val, "true", StringComparison.OrdinalIgnoreCase) ||
Expand Down Expand Up @@ -167,6 +169,30 @@ private sealed class CachedState
if (resolverResult.ResolvedSdkDirectory == null)
{
logger?.LogMessage($"Failed to resolve .NET SDK. Global.json path: {resolverResult.GlobalJsonPath}");

#if NETFRAMEWORK
// Check if we're in Visual Studio and preview SDKs are disallowed
// If so, retry allowing previews to see if a preview SDK is available
if (context.IsRunningInVisualStudio && _vsSettings.DisallowPrerelease())
{
logger?.LogString("Retrying SDK resolution allowing preview SDKs");
var retryResult = _netCoreSdkResolver.ResolveNETCoreSdkDirectory(globalJsonStartDir, context.MSBuildVersion, context.IsRunningInVisualStudio, dotnetRoot, disallowPrerelease: false);

string? previewSdkDirectory = retryResult.ResolvedSdkDirectory;
if (previewSdkDirectory != null)
{
string previewVersion = new DirectoryInfo(previewSdkDirectory).Name;
logger?.LogMessage($"Found preview SDK: {previewVersion}");
return Failure(
factory,
logger,
context.Logger,
Strings.UnableToLocateNETCoreSdkButPreviewAvailable,
previewVersion);
}
}
#endif

return Failure(
factory,
logger,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -138,4 +138,7 @@
<data name="GlobalJsonResolutionFailedSpecificVersion" xml:space="preserve">
<value>Unable to locate the .NET SDK version '{0}' as specified by global.json, please check that the specified version is installed.</value>
</data>
<data name="UnableToLocateNETCoreSdkButPreviewAvailable" xml:space="preserve">
<value>Unable to locate the .NET SDK. A preview SDK (version {0}) is available but is being blocked by your Visual Studio settings. To use preview SDKs, go to Tools -> Options -> Environment -> Preview Features and check "Use previews of the .NET SDK", or add "allowPrerelease": true to global.json.</value>
</data>
</root>

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

16 changes: 15 additions & 1 deletion src/Resolvers/Microsoft.DotNet.SdkResolver/NETCoreSdkResolver.cs
Original file line number Diff line number Diff line change
Expand Up @@ -149,7 +149,21 @@ public Version GetMinimumMSBuildVersion(string netcoreSdkDir)

public SdkResolutionResult ResolveNETCoreSdkDirectory(string? globalJsonStartDir, Version msbuildVersion, bool isRunningInVisualStudio, string? dotnetExeDir)
{
var result = NETCoreSdkResolverNativeWrapper.ResolveSdk(dotnetExeDir, globalJsonStartDir, _vsSettings.DisallowPrerelease());
return ResolveNETCoreSdkDirectory(globalJsonStartDir, msbuildVersion, isRunningInVisualStudio, dotnetExeDir, _vsSettings.DisallowPrerelease());
}

/// <summary>
/// Resolves the .NET Core SDK directory with explicit control over prerelease handling.
/// </summary>
/// <param name="globalJsonStartDir">Starting directory for global.json search</param>
/// <param name="msbuildVersion">Version of MSBuild</param>
/// <param name="isRunningInVisualStudio">Whether running in Visual Studio</param>
/// <param name="dotnetExeDir">Directory containing dotnet executable</param>
/// <param name="disallowPrerelease">Whether to disallow prerelease SDKs</param>
/// <returns>SDK resolution result</returns>
public SdkResolutionResult ResolveNETCoreSdkDirectory(string? globalJsonStartDir, Version msbuildVersion, bool isRunningInVisualStudio, string? dotnetExeDir, bool disallowPrerelease)
{
var result = NETCoreSdkResolverNativeWrapper.ResolveSdk(dotnetExeDir, globalJsonStartDir, disallowPrerelease);

string? mostCompatible = result.ResolvedSdkDirectory;
if (result.ResolvedSdkDirectory == null
Expand Down
Loading