/// <summary> /// Add a pre-parsed <see cref="DependencyContext" /> to the load context. /// </summary> /// <param name="builder">The builder.</param> /// <param name="dependencyContext">The dependency context.</param> /// <returns>The builder.</returns> public static AssemblyLoadContextBuilder AddDependencyContext(this AssemblyLoadContextBuilder builder, DependencyContext dependencyContext) { var ridGraph = dependencyContext.RuntimeGraph.Any() ? dependencyContext.RuntimeGraph : DependencyContext.Default.RuntimeGraph; var rid = Microsoft.DotNet.PlatformAbstractions.RuntimeEnvironment.GetRuntimeIdentifier(); var fallbackRid = GetFallbackRid(); var fallbackGraph = ridGraph.FirstOrDefault(g => g.Runtime == rid) ?? ridGraph.FirstOrDefault(g => g.Runtime == fallbackRid) ?? new RuntimeFallbacks("any"); foreach (var managed in dependencyContext.ResolveRuntimeAssemblies(fallbackGraph)) { builder.AddManagedLibrary(managed); } foreach (var library in dependencyContext.ResolveResourceAssemblies()) { foreach (var resource in library.ResourceAssemblies) { /* * For resource assemblies, look in $packageRoot/$packageId/$version/$resourceGrandparent * * For example, a deps file may contain * * "Example/1.0.0": { * "runtime": { * "lib/netcoreapp2.0/Example.dll": { } * }, * "resources": { * "lib/netcoreapp2.0/es/Example.resources.dll": { * "locale": "es" * } * } * } * * In this case, probing should happen in $packageRoot/example/1.0.0/lib/netcoreapp2.0 */ var resourceDir = Path.GetDirectoryName(Path.GetDirectoryName(resource.Path)); if (resourceDir != null) { var path = Path.Combine(library.Name.ToLowerInvariant(), library.Version, resourceDir); builder.AddResourceProbingSubpath(path); } } } foreach (var native in dependencyContext.ResolveNativeAssets(fallbackGraph)) { builder.AddNativeLibrary(native); } return(builder); }