Tuple <string, Assembly> ResolveManagedAssembly(string assemblyName, Func <string, Assembly> managedAssemblyLoader) { // Try to find dependency in the local folder var assemblyPath = Path.Combine(Path.GetFullPath(assemblyFolder), assemblyName); foreach (var extension in ManagedAssemblyExtensions) { try { var resolvedAssemblyPath = assemblyPath + extension; if (fileSystem.File.Exists(resolvedAssemblyPath)) { var assembly = managedAssemblyLoader(resolvedAssemblyPath); if (assembly != null) { return(Tuple.Create(resolvedAssemblyPath, assembly)); } } } catch { } } // Try to find dependency from .deps.json if (managedAssemblyMap.TryGetValue(assemblyName, out var libraryTuple)) { var library = libraryTuple.Item1; var assetGroup = libraryTuple.Item2; var wrapper = new CompilationLibrary(library.Type, library.Name, library.Version, library.Hash, assetGroup.AssetPaths, library.Dependencies, library.Serviceable, library.Path, library.HashPath); var assemblies = new List <string>(); if (assemblyResolver.TryResolveAssemblyPaths(wrapper, assemblies)) { var resolvedAssemblyPath = assemblies.FirstOrDefault(a => string.Equals(assemblyName, Path.GetFileNameWithoutExtension(a), StringComparison.OrdinalIgnoreCase)); if (resolvedAssemblyPath != null) { resolvedAssemblyPath = Path.GetFullPath(resolvedAssemblyPath); var assembly = managedAssemblyLoader(resolvedAssemblyPath); if (assembly != null) { return(Tuple.Create(resolvedAssemblyPath, assembly)); } if (internalDiagnosticsMessageSink != null) { internalDiagnosticsMessageSink.OnMessage(new _DiagnosticMessage($"[DependencyContextAssemblyCache.ResolveManagedAssembly] Resolving '{assemblyName}', found assembly path '{resolvedAssemblyPath}' but the assembly would not load")); } } else { if (internalDiagnosticsMessageSink != null) { internalDiagnosticsMessageSink.OnMessage(new _DiagnosticMessage($"[DependencyContextAssemblyCache.ResolveManagedAssembly] Resolving '{assemblyName}', found a resolved path, but could not map a filename in [{string.Join(",", assemblies.OrderBy(k => k, StringComparer.OrdinalIgnoreCase).Select(k => $"'{k}'"))}]")); } } } else { if (internalDiagnosticsMessageSink != null) { internalDiagnosticsMessageSink.OnMessage(new _DiagnosticMessage($"[DependencyContextAssemblyCache.ResolveManagedAssembly] Resolving '{assemblyName}', found in dependency map, but unable to resolve a path in [{string.Join(",", assetGroup.AssetPaths.OrderBy(k => k, StringComparer.OrdinalIgnoreCase).Select(k => $"'{k}'"))}]")); } } } return(ManagedAssemblyNotFound); }
/// <inheritdoc/> protected override IntPtr LoadUnmanagedDll(string unmanagedDllName) { unmanagedAssemblyCache.TryGetValue(unmanagedDllName, out var resolvedAssemblyPath); if (resolvedAssemblyPath != null) { return(LoadUnmanagedDllFromPath(resolvedAssemblyPath)); } if (internalDiagnosticsMessageSink != null) { internalDiagnosticsMessageSink.OnMessage(new DiagnosticMessage($"[NetCoreAssemblyDependencyResolver.LoadUnmanagedDll] Attempting resolution of unmanaged assembly '{unmanagedDllName}'")); } foreach (var format in UnmanagedDllFormats) { var formattedUnmanagedDllName = string.Format(format, unmanagedDllName); if (unmanagedAssemblyMap.TryGetValue(formattedUnmanagedDllName, out var libraryTuple)) { var library = libraryTuple.Item1; var assetGroup = libraryTuple.Item2; var wrapper = new CompilationLibrary(library.Type, library.Name, library.Version, library.Hash, assetGroup.AssetPaths, library.Dependencies, library.Serviceable); var assemblies = new List <string>(); if (assemblyResolver.TryResolveAssemblyPaths(wrapper, assemblies)) { resolvedAssemblyPath = assemblies.FirstOrDefault(a => string.Equals(formattedUnmanagedDllName, Path.GetFileName(a), StringComparison.OrdinalIgnoreCase)); if (resolvedAssemblyPath != null) { resolvedAssemblyPath = Path.GetFullPath(resolvedAssemblyPath); break; } else { if (internalDiagnosticsMessageSink != null) { internalDiagnosticsMessageSink.OnMessage(new DiagnosticMessage($"[NetCoreAssemblyDependencyResolver.LoadUnmanagedDll] Found a resolved path, but could not map a filename in [{string.Join(",", assemblies.OrderBy(k => k, StringComparer.OrdinalIgnoreCase).Select(k => $"'{k}'"))}]")); } } } else { if (internalDiagnosticsMessageSink != null) { internalDiagnosticsMessageSink.OnMessage(new DiagnosticMessage($"[NetCoreAssemblyDependencyResolver.LoadUnmanagedDll] Found in dependency map, but unable to resolve a path in [{string.Join(",", assetGroup.AssetPaths.OrderBy(k => k, StringComparer.OrdinalIgnoreCase).Select(k => $"'{k}'"))}]")); } } } } unmanagedAssemblyCache[unmanagedDllName] = resolvedAssemblyPath; var result = LoadUnmanagedDllFromPath(resolvedAssemblyPath); if (internalDiagnosticsMessageSink != null) { if (result == null) { internalDiagnosticsMessageSink.OnMessage(new DiagnosticMessage($"[NetCoreAssemblyDependencyResolver.LoadUnmanagedDll] Failed resolution, passed down to next resolver")); } else { internalDiagnosticsMessageSink.OnMessage(new DiagnosticMessage($"[NetCoreAssemblyDependencyResolver.LoadUnmanagedDll] Successful resolution via dependencies: '{resolvedAssemblyPath}'")); } } return(result != default ? result : base.LoadUnmanagedDll(unmanagedDllName)); }