diff --git a/src/libraries/Microsoft.Extensions.DependencyModel/tests/PackageResolverTest.cs b/src/libraries/Microsoft.Extensions.DependencyModel/tests/PackageResolverTest.cs index e80d94551935ab..da1c248ea62473 100644 --- a/src/libraries/Microsoft.Extensions.DependencyModel/tests/PackageResolverTest.cs +++ b/src/libraries/Microsoft.Extensions.DependencyModel/tests/PackageResolverTest.cs @@ -5,7 +5,6 @@ using System.Collections.Generic; using System.IO; using FluentAssertions; -using Microsoft.DotNet.XUnitExtensions; using Microsoft.Extensions.DependencyModel.Resolution; using Xunit; using F = Microsoft.Extensions.DependencyModel.Tests.TestLibraryFactory; @@ -28,7 +27,7 @@ public void ShouldUseEnvironmentVariableToGetDefaultLocation() result.Should().Contain(PackagesPath); } - [ConditionalFact(typeof(PlatformDetection), nameof(PlatformDetection.IsNotWindowsNanoServer))] // https://github.com/dotnet/runtime/issues/21430 + [Fact] public void ShouldUseNugetUnderUserProfile() { var environment = EnvironmentMockBuilder.Create() diff --git a/src/libraries/System.Private.CoreLib/src/System/Environment.Win32.cs b/src/libraries/System.Private.CoreLib/src/System/Environment.Win32.cs index 01b155d718aed3..70069ba483e1b5 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Environment.Win32.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Environment.Win32.cs @@ -217,7 +217,7 @@ private static string GetFolderPathCore(SpecialFolder folder, SpecialFolderOptio // The only SpecialFolderOption defines we have are equivalent to KnownFolderFlags. string folderGuid; - + string? fallbackEnv = null; switch (folder) { // Special-cased values to not use SHGetFolderPath when we have a more direct option available. @@ -230,12 +230,15 @@ private static string GetFolderPathCore(SpecialFolder folder, SpecialFolderOptio // Map the SpecialFolder to the appropriate Guid case SpecialFolder.ApplicationData: folderGuid = Interop.Shell32.KnownFolders.RoamingAppData; + fallbackEnv = "APPDATA"; break; case SpecialFolder.CommonApplicationData: folderGuid = Interop.Shell32.KnownFolders.ProgramData; + fallbackEnv = "ProgramData"; break; case SpecialFolder.LocalApplicationData: folderGuid = Interop.Shell32.KnownFolders.LocalAppData; + fallbackEnv = "LOCALAPPDATA"; break; case SpecialFolder.Cookies: folderGuid = Interop.Shell32.KnownFolders.Cookies; @@ -292,9 +295,11 @@ private static string GetFolderPathCore(SpecialFolder folder, SpecialFolderOptio break; case SpecialFolder.ProgramFiles: folderGuid = Interop.Shell32.KnownFolders.ProgramFiles; + fallbackEnv = "ProgramFiles"; break; case SpecialFolder.CommonProgramFiles: folderGuid = Interop.Shell32.KnownFolders.ProgramFilesCommon; + fallbackEnv = "CommonProgramFiles"; break; case SpecialFolder.AdminTools: folderGuid = Interop.Shell32.KnownFolders.AdminTools; @@ -346,12 +351,15 @@ private static string GetFolderPathCore(SpecialFolder folder, SpecialFolderOptio break; case SpecialFolder.UserProfile: folderGuid = Interop.Shell32.KnownFolders.Profile; + fallbackEnv = "USERPROFILE"; break; case SpecialFolder.CommonProgramFilesX86: folderGuid = Interop.Shell32.KnownFolders.ProgramFilesCommonX86; + fallbackEnv = "CommonProgramFiles(x86)"; break; case SpecialFolder.ProgramFilesX86: folderGuid = Interop.Shell32.KnownFolders.ProgramFilesX86; + fallbackEnv = "ProgramFiles(x86)"; break; case SpecialFolder.Resources: folderGuid = Interop.Shell32.KnownFolders.ResourceDir; @@ -364,18 +372,17 @@ private static string GetFolderPathCore(SpecialFolder folder, SpecialFolderOptio break; case SpecialFolder.Windows: folderGuid = Interop.Shell32.KnownFolders.Windows; + fallbackEnv = "windir"; break; } Guid folderId = new Guid(folderGuid); - int hr = Interop.Shell32.SHGetKnownFolderPath(folderId, (uint)option, IntPtr.Zero, out string path); - if (hr != 0) // Not S_OK - { - return string.Empty; - } + if (hr == 0) + return path; - return path; + // Fallback logic if SHGetKnownFolderPath failed (nanoserver) + return fallbackEnv != null ? Environment.GetEnvironmentVariable(fallbackEnv) ?? string.Empty : string.Empty; } // Separate type so a .cctor is not created for Environment which then would be triggered during startup