예제 #1
0
        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));
        }