diff --git a/src/Microsoft.Extensions.DependencyModel/Resolution/PackageCompilationAssemblyResolver.cs b/src/Microsoft.Extensions.DependencyModel/Resolution/PackageCompilationAssemblyResolver.cs index bbc8d67e0c..11ac57bb95 100644 --- a/src/Microsoft.Extensions.DependencyModel/Resolution/PackageCompilationAssemblyResolver.cs +++ b/src/Microsoft.Extensions.DependencyModel/Resolution/PackageCompilationAssemblyResolver.cs @@ -11,7 +11,7 @@ namespace Microsoft.Extensions.DependencyModel.Resolution public class PackageCompilationAssemblyResolver: ICompilationAssemblyResolver { private readonly IFileSystem _fileSystem; - private readonly string _nugetPackageDirectory; + private readonly string[] _nugetPackageDirectories; public PackageCompilationAssemblyResolver() : this(EnvironmentWrapper.Default, FileSystemWrapper.Default) @@ -19,66 +19,87 @@ public PackageCompilationAssemblyResolver() } public PackageCompilationAssemblyResolver(string nugetPackageDirectory) - : this(FileSystemWrapper.Default, nugetPackageDirectory) + : this(FileSystemWrapper.Default, new string[] { nugetPackageDirectory }) { } internal PackageCompilationAssemblyResolver(IEnvironment environment, IFileSystem fileSystem) - : this(fileSystem, GetDefaultPackageDirectory(environment)) + : this(fileSystem, GetDefaultProbeDirectories(environment)) { } - internal PackageCompilationAssemblyResolver(IFileSystem fileSystem, string nugetPackageDirectory) + internal PackageCompilationAssemblyResolver(IFileSystem fileSystem, string[] nugetPackageDirectories) { _fileSystem = fileSystem; - _nugetPackageDirectory = nugetPackageDirectory; + _nugetPackageDirectories = nugetPackageDirectories; } - private static string GetDefaultPackageDirectory(IEnvironment environment) => - GetDefaultPackageDirectory(RuntimeEnvironment.OperatingSystemPlatform, environment); + private static string[] GetDefaultProbeDirectories(IEnvironment environment) => + GetDefaultProbeDirectories(RuntimeEnvironment.OperatingSystemPlatform, environment); - internal static string GetDefaultPackageDirectory(Platform osPlatform, IEnvironment environment) + internal static string[] GetDefaultProbeDirectories(Platform osPlatform, IEnvironment environment) { - var packageDirectory = environment.GetEnvironmentVariable("NUGET_PACKAGES"); +#if !NETSTANDARD1_3 +#if NETSTANDARD1_6 + var probeDirectories = AppContext.GetData("PROBING_DIRECTORIES"); +#else + var probeDirectories = AppDomain.CurrentDomain.GetData("PROBING_DIRECTORIES"); +#endif - if (!string.IsNullOrEmpty(packageDirectory)) - { - return packageDirectory; - } + var listOfDirectories = probeDirectories as string; + + if (!string.IsNullOrEmpty(listOfDirectories)) + { + return listOfDirectories.Split(new char [] { Path.PathSeparator }, StringSplitOptions.RemoveEmptyEntries ); + } +#endif + + var packageDirectory = environment.GetEnvironmentVariable("NUGET_PACKAGES"); + + if (!string.IsNullOrEmpty(packageDirectory)) + { + return new string[] { packageDirectory }; + } + + string basePath; + if (osPlatform == Platform.Windows) + { + basePath = environment.GetEnvironmentVariable("USERPROFILE"); + } + else + { + basePath = environment.GetEnvironmentVariable("HOME"); + } + + if (string.IsNullOrEmpty(basePath)) + { + return new string[] { string.Empty }; + } + + return new string[] { Path.Combine(basePath, ".nuget", "packages") }; - string basePath; - if (osPlatform == Platform.Windows) - { - basePath = environment.GetEnvironmentVariable("USERPROFILE"); - } - else - { - basePath = environment.GetEnvironmentVariable("HOME"); - } - if (string.IsNullOrEmpty(basePath)) - { - return null; - } - return Path.Combine(basePath, ".nuget", "packages"); } public bool TryResolveAssemblyPaths(CompilationLibrary library, List assemblies) { - if (string.IsNullOrEmpty(_nugetPackageDirectory) || + if (_nugetPackageDirectories == null || _nugetPackageDirectories.Length == 0 || !string.Equals(library.Type, "package", StringComparison.OrdinalIgnoreCase)) { return false; } - string packagePath; - - if (ResolverUtils.TryResolvePackagePath(_fileSystem, library, _nugetPackageDirectory, out packagePath)) + foreach (var directory in _nugetPackageDirectories) { - assemblies.AddRange(ResolverUtils.ResolveFromPackagePath(_fileSystem, library, packagePath)); - return true; + string packagePath; + + if (ResolverUtils.TryResolvePackagePath(_fileSystem, library, directory, out packagePath)) + { + assemblies.AddRange(ResolverUtils.ResolveFromPackagePath(_fileSystem, library, packagePath)); + return true; + } } return false; } } -} \ No newline at end of file +} diff --git a/src/corehost/cli/deps_resolver.cpp b/src/corehost/cli/deps_resolver.cpp index bbaee04a12..baafcb9302 100644 --- a/src/corehost/cli/deps_resolver.cpp +++ b/src/corehost/cli/deps_resolver.cpp @@ -164,6 +164,18 @@ void deps_resolver_t::setup_shared_store_probes( } } +pal::string_t deps_resolver_t::get_probe_directories() +{ + pal::string_t directories; + for (const auto& pc : m_probes) + { + directories.append(pc.probe_dir); + directories.push_back(PATH_SEPARATOR); + } + + return directories; +} + void deps_resolver_t::setup_probe_config( const hostpolicy_init_t& init, const arguments_t& args) diff --git a/src/corehost/cli/deps_resolver.h b/src/corehost/cli/deps_resolver.h index bb9de02e33..5e0c28b42f 100644 --- a/src/corehost/cli/deps_resolver.h +++ b/src/corehost/cli/deps_resolver.h @@ -80,6 +80,8 @@ class deps_resolver_t const hostpolicy_init_t& init, const arguments_t& args); + pal::string_t get_probe_directories(); + void setup_probe_config( const hostpolicy_init_t& init, const arguments_t& args); diff --git a/src/corehost/cli/hostpolicy.cpp b/src/corehost/cli/hostpolicy.cpp index 53ac2d029e..8c1b9dc7a9 100644 --- a/src/corehost/cli/hostpolicy.cpp +++ b/src/corehost/cli/hostpolicy.cpp @@ -73,11 +73,12 @@ int run(const arguments_t& args) // Workaround: mscorlib does not resolve symlinks for AppContext.BaseDirectory dotnet/coreclr/issues/2128 "APP_CONTEXT_BASE_DIRECTORY", "APP_CONTEXT_DEPS_FILES", - "FX_DEPS_FILE" + "FX_DEPS_FILE", + "PROBING_DIRECTORIES" }; // Note: these variables' lifetime should be longer than coreclr_initialize. - std::vector tpa_paths_cstr, app_base_cstr, native_dirs_cstr, resources_dirs_cstr, fx_deps, deps, clrjit_path_cstr; + std::vector tpa_paths_cstr, app_base_cstr, native_dirs_cstr, resources_dirs_cstr, fx_deps, deps, clrjit_path_cstr, probe_directories; pal::pal_clrstring(probe_paths.tpa, &tpa_paths_cstr); pal::pal_clrstring(args.app_dir, &app_base_cstr); pal::pal_clrstring(probe_paths.native, &native_dirs_cstr); @@ -86,6 +87,8 @@ int run(const arguments_t& args) pal::pal_clrstring(resolver.get_fx_deps_file(), &fx_deps); pal::pal_clrstring(resolver.get_deps_file() + _X(";") + resolver.get_fx_deps_file(), &deps); + pal::pal_clrstring(resolver.get_probe_directories(), &probe_directories); + std::vector property_values = { // TRUSTED_PLATFORM_ASSEMBLIES tpa_paths_cstr.data(), @@ -100,7 +103,9 @@ int run(const arguments_t& args) // APP_CONTEXT_DEPS_FILES, deps.data(), // FX_DEPS_FILE - fx_deps.data() + fx_deps.data(), + //PROBING_DIRECTORIES + probe_directories.data() }; if (!clrjit_path.empty()) diff --git a/test/Microsoft.Extensions.DependencyModel.Tests/PackageResolverTest.cs b/test/Microsoft.Extensions.DependencyModel.Tests/PackageResolverTest.cs index 7ea0f725fa..6d15234e77 100644 --- a/test/Microsoft.Extensions.DependencyModel.Tests/PackageResolverTest.cs +++ b/test/Microsoft.Extensions.DependencyModel.Tests/PackageResolverTest.cs @@ -24,8 +24,8 @@ public void ShouldUseEnvironmentVariableToGetDefaultLocation() .AddVariable("NUGET_PACKAGES", PackagesPath) .Build(); - var result = PackageCompilationAssemblyResolver.GetDefaultPackageDirectory(Platform.Unknown, environment); - result.Should().Be(PackagesPath); + var result = PackageCompilationAssemblyResolver.GetDefaultProbeDirectories(Platform.Unknown, environment); + result.Should().Contain(PackagesPath); } @@ -36,8 +36,8 @@ public void ShouldUseNugetUnderUserProfileOnWindows() .AddVariable("USERPROFILE", "User Profile") .Build(); - var result = PackageCompilationAssemblyResolver.GetDefaultPackageDirectory(Platform.Windows, environment); - result.Should().Be(Path.Combine("User Profile", ".nuget", "packages")); + var result = PackageCompilationAssemblyResolver.GetDefaultProbeDirectories(Platform.Windows, environment); + result.Should().Contain(Path.Combine("User Profile", ".nuget", "packages")); } [Fact] @@ -47,8 +47,8 @@ public void ShouldUseNugetUnderHomeOnNonWindows() .AddVariable("HOME", "User Home") .Build(); - var result = PackageCompilationAssemblyResolver.GetDefaultPackageDirectory(Platform.Linux, environment); - result.Should().Be(Path.Combine("User Home", ".nuget", "packages")); + var result = PackageCompilationAssemblyResolver.GetDefaultProbeDirectories(Platform.Linux, environment); + result.Should().Contain(Path.Combine("User Home", ".nuget", "packages")); } [Fact] @@ -60,7 +60,7 @@ public void ResolvesAllAssemblies() .Build(); var library = F.Create(assemblies: F.TwoAssemblies); - var resolver = new PackageCompilationAssemblyResolver(fileSystem, PackagesPath); + var resolver = new PackageCompilationAssemblyResolver(fileSystem, new string[] { PackagesPath }); var assemblies = new List(); var result = resolver.TryResolveAssemblyPaths(library, assemblies); @@ -80,7 +80,7 @@ public void FailsWhenOneOfAssembliesNotFound() .Build(); var library = F.Create(assemblies: F.TwoAssemblies); - var resolver = new PackageCompilationAssemblyResolver(fileSystem, PackagesPath); + var resolver = new PackageCompilationAssemblyResolver(fileSystem, new string[] { PackagesPath }); var assemblies = new List(); var exception = Assert.Throws(() => resolver.TryResolveAssemblyPaths(library, assemblies));