// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. using System; using System.Collections.Generic; using System.Linq; using System.Reflection; namespace Internal.Microsoft.Extensions.DependencyModel { internal class DependencyContext { private static readonly Lazy<DependencyContext> _defaultContext = new Lazy<DependencyContext>(LoadDefault); public DependencyContext(TargetInfo target, CompilationOptions compilationOptions, IEnumerable<CompilationLibrary> compileLibraries, IEnumerable<RuntimeLibrary> runtimeLibraries, IEnumerable<RuntimeFallbacks> runtimeGraph) { if (target == null) { throw new ArgumentNullException(nameof(target)); } if (compilationOptions == null) { throw new ArgumentNullException(nameof(compilationOptions)); } if (compileLibraries == null) { throw new ArgumentNullException(nameof(compileLibraries)); } if (runtimeLibraries == null) { throw new ArgumentNullException(nameof(runtimeLibraries)); } if (runtimeGraph == null) { throw new ArgumentNullException(nameof(runtimeGraph)); } Target = target; CompilationOptions = compilationOptions; CompileLibraries = compileLibraries.ToArray(); RuntimeLibraries = runtimeLibraries.ToArray(); RuntimeGraph = runtimeGraph.ToArray(); } public static DependencyContext Default => _defaultContext.Value; public TargetInfo Target { get; } public CompilationOptions CompilationOptions { get; } public IReadOnlyList<CompilationLibrary> CompileLibraries { get; } public IReadOnlyList<RuntimeLibrary> RuntimeLibraries { get; } public IReadOnlyList<RuntimeFallbacks> RuntimeGraph { get; } public DependencyContext Merge(DependencyContext other) { if (other == null) { throw new ArgumentNullException(nameof(other)); } return new DependencyContext( Target, CompilationOptions, CompileLibraries.Union(other.CompileLibraries, new LibraryMergeEqualityComparer<CompilationLibrary>()), RuntimeLibraries.Union(other.RuntimeLibraries, new LibraryMergeEqualityComparer<RuntimeLibrary>()), RuntimeGraph.Union(other.RuntimeGraph) ); } private static DependencyContext LoadDefault() { var entryAssembly = Assembly.GetEntryAssembly(); if (entryAssembly == null) { return null; } return Load(entryAssembly); } public static DependencyContext Load(Assembly assembly) { return DependencyContextLoader.Default.Load(assembly); } private class LibraryMergeEqualityComparer<T> : IEqualityComparer<T> where T : Library { public bool Equals(T x, T y) { return StringComparer.OrdinalIgnoreCase.Equals(x.Name, y.Name); } public int GetHashCode(T obj) { return StringComparer.OrdinalIgnoreCase.GetHashCode(obj.Name); } } } } |