private static Assembly GetRuntimeAssembly(string name)
        {
            var path = Assembly.GetEntryAssembly().Location;
            var library = DependencyContext.Default.RuntimeLibraries.Where(x => x.Name.ToLower() == name.ToLower()).FirstOrDefault();
            if (library == null)
            {
                return null;
            }
            var r = new CompositeCompilationAssemblyResolver(new ICompilationAssemblyResolver[]
        {
            new AppBaseCompilationAssemblyResolver(Path.GetDirectoryName(path)),
            new ReferenceAssemblyPathResolver(),
            new PackageCompilationAssemblyResolver()
        });

            var wrapper = new CompilationLibrary(
                library.Type,
                library.Name,
                library.Version,
                library.Hash,
                library.RuntimeAssemblyGroups.SelectMany(g => g.AssetPaths),
                library.Dependencies,
                library.Serviceable);

            var assemblies = new List<string>();
            r.TryResolveAssemblyPaths(wrapper, assemblies);
            if (assemblies.Count > 0)
            {
                return AssemblyLoadContext.Default.LoadFromAssemblyPath(assemblies[0]);
            }
            else
            {
                return null;
            }
        }
示例#2
0
        private static void FindDependency(Assembly assembly)
        {
            DependencyContext dependencyContext = DependencyContext.Load(assembly);

            if (dependencyContext != null)
            {
                foreach (var compilationLibrary in dependencyContext.CompileLibraries)
                {
                    if (!DependencyDLL.ContainsKey(compilationLibrary.Name) &&
                        !AppDomain.CurrentDomain.GetAssemblies().Any(a => a.FullName.Split(',')[0] == compilationLibrary.Name))
                    {
                        RuntimeLibrary library = dependencyContext.RuntimeLibraries.FirstOrDefault(runtime => runtime.Name == compilationLibrary.Name);
                        var            cb      = new CompilationLibrary(
                            library.Type,
                            library.Name,
                            library.Version,
                            library.Hash,
                            library.RuntimeAssemblyGroups.SelectMany(g => g.AssetPaths),
                            library.Dependencies,
                            library.Serviceable);

                        DependencyDLL[library.Name] = cb;
                    }
                }
            }
        }
示例#3
0
        /// <summary>
        /// 获取CLI版本号
        /// </summary>
        public static string GetCliVersion()
        {
            string[] dllNames =
            {
                "Microsoft.EntityFrameworkCore",
                "Microsoft.Extensions.Configuration.Binder",
                "Microsoft.Extensions.DependencyInjection",
                "Microsoft.Extensions.DependencyInjection.Abstractions",
                "Microsoft.Extensions.Configuration.Abstractions"
            };
            CompilationLibrary lib = null;

            foreach (var dllName in dllNames)
            {
                lib = DependencyContext.Default.CompileLibraries.FirstOrDefault(m => m.Name == dllName);
                if (lib != null)
                {
                    break;
                }
            }

            var cliVersion = lib?.Version;

            return(cliVersion);
        }
示例#4
0
        public bool TryResolveAssemblyPaths([NotNull] CompilationLibrary library, [NotNull][ItemNotNull] List <string> assemblies)
        {
            if (_nugetPackageDirectories.Count == 0 || !string.Equals(library.Type, "package", StringComparison.OrdinalIgnoreCase))
            {
                return(false);
            }

            foreach (var directory in _nugetPackageDirectories)
            {
                if (!ResolverUtils.TryResolvePackagePath(FileSystem, library, directory, out var packagePath))
                {
                    continue;
                }

                if (!TryResolveFromPackagePath(library, packagePath, out var fullPathsFromPackage))
                {
                    continue;
                }

                assemblies.AddRange(fullPathsFromPackage);
                return(true);
            }

            return(false);
        }
示例#5
0
        /// <summary>
        /// Invoked when the resolution of an assembly fails.
        /// </summary>
        private Assembly OnResolving(AssemblyLoadContext context, AssemblyName assemblyName)
        {
            Debug.WriteLine($"<Coyote> Resolving assembly '{assemblyName.Name}'.");
            RuntimeLibrary runtimeLibrary = this.DependencyContext.RuntimeLibraries.FirstOrDefault(
                runtime => string.Equals(runtime.Name, assemblyName.Name, StringComparison.OrdinalIgnoreCase));

            if (runtimeLibrary != null)
            {
                var assemblies         = new List <string>();
                var compilationLibrary = new CompilationLibrary(
                    runtimeLibrary.Type,
                    runtimeLibrary.Name,
                    runtimeLibrary.Version,
                    runtimeLibrary.Hash,
                    runtimeLibrary.RuntimeAssemblyGroups.SelectMany(group => group.AssetPaths),
                    runtimeLibrary.Dependencies,
                    runtimeLibrary.Serviceable);
                if (this.AssemblyResolver.TryResolveAssemblyPaths(compilationLibrary, assemblies) &&
                    assemblies.Count > 0)
                {
                    return(this.LoadContext.LoadFromAssemblyPath(assemblies[0]));
                }
                else
                {
                    string directory = Path.GetDirectoryName(this.Assembly.Location);
                    string path      = Directory.EnumerateFiles(directory, $"{runtimeLibrary.Name}.dll").FirstOrDefault();
                    return(this.LoadContext.LoadFromAssemblyPath(path));
                }
            }

            return(null);
        }
        private Assembly OnResolvingLoadContextAssemblyReference(AssemblyLoadContext loadContext, AssemblyName assemblyName
                                                                 , StringBinaryPredicate predicate)
        {
            bool TryResolveAssemblyPaths(out IEnumerable <string> assemblyPaths)
            {
                // ReSharper disable once RedundantEmptyObjectOrCollectionInitializer
                var paths = (List <string>)(assemblyPaths = new List <string> {
                });

                var rl = FindMatchingLibrary(Context.RuntimeLibraries, assemblyName, predicate);

                if (rl == null)
                {
                    return(false);
                }

                var groups = rl.RuntimeAssemblyGroups;

                var cl = new CompilationLibrary(rl.Type, rl.Name, rl.Version, rl.Hash
                                                , groups.SelectMany(g => g.AssetPaths), rl.Dependencies, rl.Serviceable);

                return(Resolver.TryResolveAssemblyPaths(cl, paths) && assemblyPaths.Any());
            }

            if (TryResolveAssemblyPaths(out var resolvedPaths))
            {
                return(resolvedPaths.Select(loadContext.LoadFromAssemblyPath).FirstOrDefault());
            }

            // TODO: TBD: which, it would seem, `additional´ reference paths are intended to augment the naturally resolved DC.
            return(AdditionalReferencePaths.Select(GetFileNameWithoutExtension)
                   .Where(f => predicate(f, assemblyName.Name))
                   .Select(loadContext.LoadFromAssemblyPath).FirstOrDefault());
        }
        public bool TryResolveAssemblyPaths(CompilationLibrary library, List<string> assemblies)
        {
            if (!string.Equals(library.LibraryType, "package", StringComparison.OrdinalIgnoreCase))
            {
                return false;
            }

            if (!string.IsNullOrEmpty(_packageCacheDirectory))
            {
                var hashSplitterPos = library.Hash.IndexOf('-');
                if (hashSplitterPos <= 0 || hashSplitterPos == library.Hash.Length - 1)
                {
                    throw new InvalidOperationException($"Invalid hash entry '{library.Hash}' for package '{library.PackageName}'");
                }

                var hashAlgorithm = library.Hash.Substring(0, hashSplitterPos);

                var cacheHashPath = Path.Combine(_packageCacheDirectory, $"{library.PackageName}.{library.Version}.nupkg.{hashAlgorithm}");

                if (_fileSystem.File.Exists(cacheHashPath) &&
                    _fileSystem.File.ReadAllText(cacheHashPath) == library.Hash.Substring(hashSplitterPos + 1))
                {
                    string packagePath;
                    if (ResolverUtils.TryResolvePackagePath(_fileSystem, library, _packageCacheDirectory, out packagePath))
                    {
                        assemblies.AddRange( ResolverUtils.ResolveFromPackagePath(_fileSystem, library, packagePath));
                        return true;
                    }
                }
            }
            return false;
        }
        /// <inheritdoc/>
        public bool TryResolveAssemblyPaths(CompilationLibrary library, List <string> assemblies)
        {
            var basePath = RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ?
                           @"c:\Program Files\dotnet\shared" :
                           "/usr/local/share/dotnet/shared";

            var found = false;

            foreach (var path in Directory.GetDirectories(basePath))
            {
                if (found)
                {
                    break;
                }
                var versionDir = Path.Combine(path, library.Version);
                if (Directory.Exists(versionDir))
                {
                    foreach (var file in Directory.GetFiles(versionDir))
                    {
                        if (found)
                        {
                            break;
                        }
                        if (Path.GetFileName(file).ToLower().Equals(library.Name.ToLower() + ".dll"))
                        {
                            assemblies.Add(file);
                            found = true;
                        }
                    }
                }
            }

            return(found);
        }
示例#9
0
        /// <inheritdoc/>
        public bool TryResolveAssemblyPaths(CompilationLibrary library, List <string> assemblies)
        {
            var basePath = RuntimeInformation.IsOSPlatform(OSPlatform.Windows)?
                           @"c:\Program Files\dotnet\store":
                           "/usr/local/share/dotnet/store";

            var cpuBasePath = Path.Combine(basePath, RuntimeInformation.ProcessArchitecture.ToString().ToLowerInvariant());

            if (!Directory.Exists(cpuBasePath))
            {
                return(false);
            }

            var found = false;

            foreach (var targetFrameworkBasePath in Directory.GetDirectories(cpuBasePath))
            {
                var libraryBasePath = Path.Combine(targetFrameworkBasePath, library.Path);
                foreach (var assembly in library.Assemblies)
                {
                    var assemblyPath = Path.Combine(libraryBasePath, assembly);
                    if (File.Exists(assemblyPath))
                    {
                        assemblies.Add(assemblyPath);
                        found = true;
                    }
                }
            }

            return(found);
        }
        public bool TryResolveAssemblyPaths(CompilationLibrary library, List <string>?assemblies)
        {
            ThrowHelper.ThrowIfNull(library);

            if (_nugetPackageDirectories == null || _nugetPackageDirectories.Length == 0 ||
                !string.Equals(library.Type, "package", StringComparison.OrdinalIgnoreCase))
            {
                return(false);
            }

            foreach (string directory in _nugetPackageDirectories)
            {
                string packagePath;

                if (ResolverUtils.TryResolvePackagePath(_fileSystem, library, directory, out packagePath))
                {
                    if (TryResolveFromPackagePath(_fileSystem, library, packagePath, out IEnumerable <string>?fullPathsFromPackage))
                    {
                        assemblies?.AddRange(fullPathsFromPackage);
                        return(true);
                    }
                }
            }
            return(false);
        }
        private Assembly OnResolving(AssemblyLoadContext context, AssemblyName name)
        {
            bool NamesMatch(RuntimeLibrary runtime)
            {
                return(string.Equals(runtime.Name, name.Name, StringComparison.OrdinalIgnoreCase));
            }

            _logger.LogInformation("Loading " + name.FullName);

            var library =
                _dependencyContext.RuntimeLibraries.FirstOrDefault(NamesMatch);

            if (library != null)
            {
                var wrapper = new CompilationLibrary(
                    library.Type,
                    library.Name,
                    library.Version,
                    library.Hash,
                    library.RuntimeAssemblyGroups.SelectMany(g => g.AssetPaths),
                    library.Dependencies,
                    library.Serviceable);

                var assemblies = new List <string>();
                _assemblyResolver.TryResolveAssemblyPaths(wrapper, assemblies);
                if (assemblies.Count > 0)
                {
                    return(_loadContext.LoadFromAssemblyPath(assemblies[0]));
                }
            }
            _logger.LogWarning("Could not load assembly " + name.FullName);

            return(null);
        }
        private Assembly LoadContextOnResolving(AssemblyLoadContext context, AssemblyName assemblyName)
        {
            bool NamesMatch(RuntimeLibrary runtime)
            {
                return(string.Equals(runtime.Name, assemblyName.Name, StringComparison.OrdinalIgnoreCase));
            }

#if DEBUG
            _trace.WriteLine($"[NetCoreAssemblyRuntimeLoader] Attempting to resolve [{assemblyName}]");
#endif

            var runtimeLibrary = _dependencyContext.RuntimeLibraries.FirstOrDefault(x => NamesMatch(x));
            if (runtimeLibrary != null)
            {
#if DEBUG
                _trace.WriteLine($"[NetCoreAssemblyRuntimeLoader] Found [{runtimeLibrary}]");
#endif
                var wrapper = new CompilationLibrary(runtimeLibrary.Type, runtimeLibrary.Name,
                                                     runtimeLibrary.Version, runtimeLibrary.Hash,
                                                     runtimeLibrary.RuntimeAssemblyGroups.SelectMany(a => a.AssetPaths),
                                                     runtimeLibrary.Dependencies, runtimeLibrary.Serviceable);

                var loadedAssemblies = new List <string>();
                if (_resolver.TryResolveAssemblyPaths(wrapper, loadedAssemblies) && loadedAssemblies.Any())
                {
                    return(_loadContext.LoadFromAssemblyPath(loadedAssemblies[0]));
                }
            }

            return(null);
        }
        private Assembly OnResolving(AssemblyLoadContext context, AssemblyName name)
        {
            bool NamesMatch(RuntimeLibrary runtime) =>
            string.Equals(runtime.Name, name.Name, StringComparison.OrdinalIgnoreCase);

            var library = this.dependencyContext.RuntimeLibraries.FirstOrDefault(NamesMatch);

            if (library is object)
            {
                var wrapper = new CompilationLibrary(
                    library.Type,
                    library.Name,
                    library.Version,
                    library.Hash,
                    library.RuntimeAssemblyGroups.SelectMany(g => g.AssetPaths),
                    library.Dependencies,
                    library.Serviceable);

                var assemblies = new List <string>();
                this.assemblyResolver.TryResolveAssemblyPaths(wrapper, assemblies);
                if (assemblies.Count > 0)
                {
                    return(this.loadContext.LoadFromAssemblyPath(assemblies[0]));
                }
            }

            return(null);
        }
示例#14
0
        /// <inheritdoc/>
        public bool TryResolveAssemblyPaths(CompilationLibrary library, List <string> assemblies)
        {
            if (_nugetPackageDirectories == null || _nugetPackageDirectories.Length == 0 ||
                !string.Equals(library.Type, "package", StringComparison.OrdinalIgnoreCase))
            {
                return(false);
            }

            foreach (var directory in _nugetPackageDirectories)
            {
                if (TryResolvePackagePath(library, directory, out string packagePath))
                {
                    if (TryResolveFromPackagePath(library, packagePath, out IEnumerable <string> fullPathsFromPackage))
                    {
                        if (fullPathsFromPackage.Any())
                        {
                            assemblies.AddRange(fullPathsFromPackage);
                        }
                        else
                        {
                            var libPath = Path.Join(packagePath, "lib");
                            var dllName = $"{library.Name}.dll";
                            var paths   = Directory.EnumerateFiles(libPath, dllName, SearchOption.AllDirectories);
                            assemblies.AddRange(paths);
                        }

                        return(true);
                    }
                }
            }

            return(false);
        }
示例#15
0
        private Assembly AssemblyLoadContextResolving(AssemblyLoadContext context, AssemblyName name)
        {
            // Attempt to resolve the library from one of the dependency contexts.
            var library = _resolverDependencyContext?.RuntimeLibraries?.FirstOrDefault(NamesMatch);

            if (library == null)
            {
                return(null);
            }

            var wrapper = new CompilationLibrary(
                library.Type,
                library.Name,
                library.Version,
                library.Hash,
                library.RuntimeAssemblyGroups.SelectMany(g => g.AssetPaths),
                library.Dependencies,
                library.Serviceable);

            var assemblies = new List <string>();

            if (_assemblyResolver.TryResolveAssemblyPaths(wrapper, assemblies))
            {
                foreach (var assembly in assemblies.Select(TryLoadAssemblyFromPath).Where(assembly => assembly != null))
                {
                    return(assembly);
                }
            }

            return(null);

            bool NamesMatch(RuntimeLibrary runtime) => string.Equals(runtime.Name, name.Name, StringComparison.OrdinalIgnoreCase);
        }
示例#16
0
        public void PassesLibraryToAllResolvers()
        {
            var fail      = new Mock <ICompilationAssemblyResolver>();
            var failTwo   = new Mock <ICompilationAssemblyResolver>();
            var resolvers = new[]
            {
                fail.Object,
                failTwo.Object
            };

            var library = new CompilationLibrary(
                string.Empty,
                string.Empty,
                string.Empty,
                string.Empty,
                Enumerable.Empty <string>(),
                Enumerable.Empty <Dependency>(),
                false);

            var resolver = new CompositeCompilationAssemblyResolver(resolvers);
            var result   = resolver.TryResolveAssemblyPaths(library, null);

            fail.Verify(r => r.TryResolveAssemblyPaths(library, null), Times.Once());
            failTwo.Verify(r => r.TryResolveAssemblyPaths(library, null), Times.Once());
        }
示例#17
0
        public void PopulatedAssemblies()
        {
            var fail    = new Mock <ICompilationAssemblyResolver>();
            var success = new Mock <ICompilationAssemblyResolver>();

            success.Setup(r => r.TryResolveAssemblyPaths(It.IsAny <CompilationLibrary>(), It.IsAny <List <string> >()))
            .Returns(true)
            .Callback((CompilationLibrary l, List <string> a) =>
            {
                a.Add("Assembly");
            });

            var resolvers = new[]
            {
                fail.Object,
                success.Object
            };

            var assemblies = new List <string>();
            var library    = new CompilationLibrary(
                string.Empty,
                string.Empty,
                string.Empty,
                string.Empty,
                Enumerable.Empty <string>(),
                Enumerable.Empty <Dependency>(),
                false);

            var resolver = new CompositeCompilationAssemblyResolver(resolvers);
            var result   = resolver.TryResolveAssemblyPaths(library, assemblies);

            assemblies.Should().Contain("Assembly");
        }
        public void ResolveDependencies(CompilationLibrary library, List <CompilationLibrary> compileLibraries, string[] packageFolders, List <AssemblyInfo> assemblyReferences)
        {
            if (library.Name == "NETStandard.Library" || _resolvedDependencies.Any(x => x.Name == library.Name))
            {
                return;
            }

            _resolvedDependencies.Add(library);

            foreach (var dependency in library.Dependencies)
            {
                var dep = compileLibraries.FirstOrDefault(x => x.Name.Equals(dependency.Name));
                if (dep.Assemblies != null && dep.Assemblies.Count() != 0 && !dep.Assemblies[0].EndsWith("_._"))
                {
                    bool packageFound = AddAssemblyReference(packageFolders, dep, assemblyReferences);

                    if (!packageFound)
                    {
                        throw new ScriptException($"Nuget package {dependency.Name} not found.");
                    }

                    ResolveDependencies(dep, compileLibraries, packageFolders, assemblyReferences);
                }
            }
        }
示例#19
0
        public T Resolve <T>()
            where T : class
        {
            IEnumerable <RuntimeLibrary> libraries = this.DependencyContext.RuntimeLibraries;

            if (libraries != null)
            {
                foreach (RuntimeLibrary library in libraries)
                {
                    var wrapper = new CompilationLibrary(
                        library.Type,
                        library.Name,
                        library.Version,
                        library.Hash,
                        library.RuntimeAssemblyGroups.SelectMany(g => g.AssetPaths),
                        library.Dependencies,
                        library.Serviceable);

                    var assemblies = new List <string>();
                    this._assemblyResolver.TryResolveAssemblyPaths(wrapper, assemblies);
                    if (assemblies.Count > 0)
                    {
                        foreach (string path in assemblies)
                        {
                            this.LoadContext.LoadFromAssemblyPath(path);
                            Assembly.UnsafeLoadFrom(path);
                        }
                    }
                }
            }

            return((T)Activator.CreateInstance(this.Assembly.GetTypes().FirstOrDefault(p => typeof(T).IsAssignableFrom(p))));
        }
        /// <inheritdoc/>
        public bool TryResolveAssemblyPaths(CompilationLibrary library, List <string> assemblies)
        {
            var basePath = RuntimeInformation.IsOSPlatform(OSPlatform.Windows)?
                           @"c:\Program Files\dotnet\sdk\NuGetFallbackFolder":
                           "/usr/local/share/dotnet/sdk/NuGetFallbackFolder";

            if (!Directory.Exists(basePath))
            {
                return(false);
            }

            var found = false;

            var libraryBasePath = Path.Combine(basePath, library.Path);

            foreach (var assembly in library.Assemblies)
            {
                var assemblyPath = Path.Combine(libraryBasePath, assembly);
                if (File.Exists(assemblyPath))
                {
                    assemblies.Add(assemblyPath);
                    found = true;
                }
            }

            return(found);
        }
示例#21
0
        private Assembly Resolve(AssemblyLoadContext context, AssemblyName assemblyName)
        {
            var dependency = _dependencyContext.RuntimeLibraries.SingleOrDefault(d => d.Name.Equals(assemblyName.Name, StringComparison.OrdinalIgnoreCase));

            if (dependency == null)
            {
                return(null);
            }

            var library = new CompilationLibrary(
                dependency.Type,
                dependency.Name,
                dependency.Version,
                dependency.Hash,
                dependency.RuntimeAssemblyGroups.SelectMany(g => g.AssetPaths),
                dependency.Dependencies,
                dependency.Serviceable);

            var assemblies = new List <string>();

            if (_resolver.TryResolveAssemblyPaths(library, assemblies) && assemblies.Count > 0)
            {
                try
                {
                    return(_assemblyLoadContext.LoadFromAssemblyPath(assemblies[0]));
                }
                catch (Exception e)
                {
                    Debug.Write(e);
                }
            }

            return(null);
        }
        /// <inheritdoc/>
        protected override IntPtr LoadUnmanagedDll(string unmanagedDllName)
        {
            if (unmanagedAssemblyMap.TryGetValue(unmanagedDllName, 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))
                {
                    var resolvedAssemblyPath = assemblies.FirstOrDefault(a => string.Equals(unmanagedDllName, Path.GetFileName(a), StringComparison.OrdinalIgnoreCase));
                    if (resolvedAssemblyPath != null)
                    {
                        var assembly = LoadUnmanagedDllFromPath(resolvedAssemblyPath);
                        if (assembly != null)
                        {
                            return(assembly);
                        }
                    }
                }
            }

            return(base.LoadUnmanagedDll(unmanagedDllName));
        }
        public bool TryResolveAssemblyPaths(CompilationLibrary library, List <string> assemblies)
        {
            if (!string.Equals(library.Type, "package", StringComparison.OrdinalIgnoreCase))
            {
                return(false);
            }

            if (!string.IsNullOrEmpty(_packageCacheDirectory))
            {
                var hashSplitterPos = library.Hash.IndexOf('-');
                if (hashSplitterPos <= 0 || hashSplitterPos == library.Hash.Length - 1)
                {
                    throw new InvalidOperationException($"Invalid hash entry '{library.Hash}' for package '{library.Name}'");
                }

                string packagePath;
                if (ResolverUtils.TryResolvePackagePath(library, _packageCacheDirectory, out packagePath))
                {
                    var hashAlgorithm = library.Hash.Substring(0, hashSplitterPos);
                    var cacheHashPath = Path.Combine(packagePath, $"{library.Name}.{library.Version}.nupkg.{hashAlgorithm}");

                    if (File.Exists(cacheHashPath) &&
                        File.ReadAllText(cacheHashPath) == library.Hash.Substring(hashSplitterPos + 1))
                    {
                        assemblies.AddRange(ResolverUtils.ResolveFromPackagePath(library, packagePath));
                        return(true);
                    }
                }
            }
            return(false);
        }
        private Assembly OnResolving(AssemblyLoadContext context, AssemblyName name)
        {
            var library = _dependencyContext.RuntimeLibraries.FirstOrDefault((library) =>
            {
                return(string.Equals(library.Name, name.Name, StringComparison.OrdinalIgnoreCase));
            });

            if (library != null)
            {
                var wrapper = new CompilationLibrary(
                    library.Type,
                    library.Name,
                    library.Version,
                    library.Hash,
                    library.RuntimeAssemblyGroups.SelectMany(group => group.AssetPaths),
                    library.Dependencies,
                    library.Serviceable);

                var assemblies = new List <string>();
                _assemblyResolver.TryResolveAssemblyPaths(wrapper, assemblies);
                if (assemblies.Count > 0)
                {
                    return(_loadContext.LoadFromAssemblyPath(assemblies[0]));
                }
            }
            return(null);
        }
示例#25
0
            public bool TryResolveAssemblyPaths(CompilationLibrary library, List <string> assemblies)
            {
                if (!string.Equals(library.Type, "reference", StringComparison.OrdinalIgnoreCase))
                {
                    return(false);
                }

                var paths = new List <string>();

                foreach (var assembly in library.Assemblies)
                {
                    var path = Path.Combine(ApplicationEnvironment.ApplicationBasePath, assembly);

                    if (!File.Exists(path))
                    {
                        return(false);
                    }

                    paths.Add(path);
                }

                assemblies.AddRange(paths);

                return(true);
            }
        private Assembly ResolveAssembly(AssemblyLoadContext context, AssemblyName name)
        {
            var library = FindMatchingLibrary(this.dependencyContext.RuntimeLibraries, name);

            if (library == null)
            {
                return(null);
            }
            var wrapper = new CompilationLibrary(
                library.Type,
                library.Name,
                library.Version,
                library.Hash,
                library.RuntimeAssemblyGroups.SelectMany(g => g.AssetPaths),
                library.Dependencies,
                library.Serviceable);

            var assemblyPaths = new List <string>();

            this.assemblyResolver.TryResolveAssemblyPaths(wrapper, assemblyPaths);

            if (assemblyPaths.Count == 0)
            {
                var matches = from refAssemblyPath in this.ReferencePath
                              where Path.GetFileNameWithoutExtension(refAssemblyPath).Equals(name.Name, StringComparison.OrdinalIgnoreCase)
                              select context.LoadFromAssemblyPath(refAssemblyPath);

                return(matches.FirstOrDefault());
            }

            return(assemblyPaths.Select(context.LoadFromAssemblyPath).FirstOrDefault());
        }
示例#27
0
        public DependencyContext Build()
        {
            bool includeCompilationLibraries = _compilationOptions != null;

            IEnumerable <LockFileTargetLibrary> runtimeExports     = _projectContext.GetRuntimeLibraries(_privateAssetPackageIds);
            IEnumerable <LockFileTargetLibrary> compilationExports =
                includeCompilationLibraries ?
                _projectContext.GetCompileLibraries(_privateAssetPackageIds) :
                Enumerable.Empty <LockFileTargetLibrary>();

            var dependencyLookup = compilationExports
                                   .Concat(runtimeExports)
                                   .Distinct()
                                   .Select(library => new Dependency(library.Name, library.Version.ToString()))
                                   .ToDictionary(dependency => dependency.Name, StringComparer.OrdinalIgnoreCase);

            var libraryLookup = new LockFileLookup(_projectContext.LockFile);

            var runtimeSignature = GenerateRuntimeSignature(runtimeExports);

            RuntimeLibrary projectRuntimeLibrary = GetProjectRuntimeLibrary(
                _mainProjectInfo,
                _projectContext,
                dependencyLookup);
            IEnumerable <RuntimeLibrary> runtimeLibraries =
                new[] { projectRuntimeLibrary }
            .Concat(GetLibraries(runtimeExports, libraryLookup, dependencyLookup, runtime: true).Cast <RuntimeLibrary>());

            IEnumerable <CompilationLibrary> compilationLibraries;

            if (includeCompilationLibraries)
            {
                CompilationLibrary projectCompilationLibrary = GetProjectCompilationLibrary(
                    _mainProjectInfo,
                    _projectContext,
                    dependencyLookup);
                compilationLibraries =
                    new[] { projectCompilationLibrary }
                .Concat(GetFrameworkLibraries())
                .Concat(GetLibraries(compilationExports, libraryLookup, dependencyLookup, runtime: false).Cast <CompilationLibrary>());
            }
            else
            {
                compilationLibraries = Enumerable.Empty <CompilationLibrary>();
            }

            var targetInfo = new TargetInfo(
                _projectContext.LockFileTarget.TargetFramework.DotNetFrameworkName,
                _projectContext.LockFileTarget.RuntimeIdentifier,
                runtimeSignature,
                _projectContext.IsPortable);

            return(new DependencyContext(
                       targetInfo,
                       _compilationOptions ?? CompilationOptions.Default,
                       compilationLibraries,
                       runtimeLibraries,
                       new RuntimeFallbacks[] { }));
        }
示例#28
0
        private Assembly?OnResolving(AssemblyLoadContext context, AssemblyName name)
        {
            //hack for loaded assemblies
            if (name.Name == "Mapster")
            {
                return(typeof(TypeAdapterConfig).Assembly);
            }
            if (name.Name == "Mapster.Core")
            {
                return(typeof(MapperAttribute).Assembly);
            }
            if (name.Name == "System.Text.Json")
            {
                return(typeof(JsonIgnoreAttribute).Assembly);
            }

            var(library, assetPath) = (from lib in _dependencyContext.RuntimeLibraries
                                       from grp in lib.RuntimeAssemblyGroups
                                       where grp.Runtime == string.Empty
                                       from path in grp.AssetPaths
                                       where string.Equals(GetAssemblyName(path), name.Name, StringComparison.OrdinalIgnoreCase)
                                       select(lib, path)).FirstOrDefault();

            if (library == null)
            {
                Console.WriteLine("Cannot find library: " + name.Name);
                return(null);
            }

            try
            {
                var wrapped = new CompilationLibrary(
                    library.Type,
                    library.Name,
                    library.Version,
                    library.Hash,
                    new[] { assetPath },
                    library.Dependencies,
                    library.Serviceable);

                var assemblies = new List <string>();
                _assemblyResolver.TryResolveAssemblyPaths(wrapped, assemblies);

                if (assemblies.Count == 0)
                {
                    Console.WriteLine($"Cannot find assembly path: {name.Name} (type={library.Type}, version={library.Version})");
                    return(null);
                }

                return(_loadContext.LoadFromAssemblyPath(assemblies[0]));
            }
            catch (Exception ex)
            {
                Console.WriteLine($"Cannot find assembly path: {name.Name} (type={library.Type}, version={library.Version})");
                Console.WriteLine("exception: " + ex.Message);
                return(null);
            }
        }
示例#29
0
 internal static bool TryResolvePackagePath(IFileSystem fileSystem, CompilationLibrary library, string basePath, out string packagePath)
 {
     packagePath = Path.Combine(basePath, library.Name, library.Version);
     if (fileSystem.Directory.Exists(packagePath))
     {
         return true;
     }
     return false;
 }
示例#30
0
 internal static bool TryResolvePackagePath(CompilationLibrary library, string basePath, out string packagePath)
 {
     packagePath = Path.Combine(basePath, library.Name, library.Version);
     if (Directory.Exists(packagePath))
     {
         return(true);
     }
     return(false);
 }
示例#31
0
        /// <summary>
        /// 构造一个 <see cref="AssemblyDescriptor"/>。
        /// </summary>
        /// <param name="name">给定的名称。</param>
        /// <param name="compiled">给定的已编译程序集。</param>
        /// <param name="isItself">是否为已编译程序集自身(可选)。</param>
        /// <param name="library">给定的 <see cref="CompilationLibrary"/>(可选)。</param>
        public AssemblyDescriptor(string name, Assembly compiled,
                                  bool?isItself = null, CompilationLibrary library = null)
        {
            Name     = name.NotEmpty(nameof(name));
            Compiled = compiled.NotNull(nameof(compiled));

            IsItself = isItself ?? Name == compiled.GetDisplayName();
            Library  = library;
        }
示例#32
0
        public DependencyContext Build(
            SingleProjectInfo mainProjectInfo,
            CompilationOptions compilationOptions,
            LockFile lockFile,
            NuGetFramework framework,
            string runtime)
        {
            bool includeCompilationLibraries = compilationOptions != null;

            LockFileTarget lockFileTarget = lockFile.GetTarget(framework, runtime);

            IEnumerable <LockFileTargetLibrary> runtimeExports     = lockFileTarget.GetRuntimeLibraries();
            IEnumerable <LockFileTargetLibrary> compilationExports =
                includeCompilationLibraries ?
                lockFileTarget.GetCompileLibraries() :
                Enumerable.Empty <LockFileTargetLibrary>();

            var dependencyLookup = compilationExports
                                   .Concat(runtimeExports)
                                   .Distinct()
                                   .Select(library => new Dependency(library.Name, library.Version.ToString()))
                                   .ToDictionary(dependency => dependency.Name, StringComparer.OrdinalIgnoreCase);

            var libraryLookup = lockFile.Libraries.ToDictionary(l => l.Name, StringComparer.OrdinalIgnoreCase);

            var runtimeSignature = GenerateRuntimeSignature(runtimeExports);

            IEnumerable <RuntimeLibrary> runtimeLibraries =
                GetLibraries(runtimeExports, libraryLookup, dependencyLookup, runtime: true).Cast <RuntimeLibrary>();

            IEnumerable <CompilationLibrary> compilationLibraries;

            if (includeCompilationLibraries)
            {
                CompilationLibrary projectCompilationLibrary = GetProjectCompilationLibrary(
                    mainProjectInfo,
                    lockFile,
                    lockFileTarget,
                    dependencyLookup);
                compilationLibraries = new[] { projectCompilationLibrary }
                .Concat(
                    GetLibraries(compilationExports, libraryLookup, dependencyLookup, runtime: false)
                    .Cast <CompilationLibrary>());
            }
            else
            {
                compilationLibraries = Enumerable.Empty <CompilationLibrary>();
            }

            return(new DependencyContext(
                       new TargetInfo(framework.DotNetFrameworkName, runtime, runtimeSignature, lockFileTarget.IsPortable()),
                       compilationOptions ?? CompilationOptions.Default,
                       compilationLibraries,
                       runtimeLibraries,
                       new RuntimeFallbacks[] { }));
        }
        public bool TryResolveAssemblyPaths(CompilationLibrary library, List<string> assemblies)
        {
            var isProject = string.Equals(library.LibraryType, "project", StringComparison.OrdinalIgnoreCase);

            if (!isProject &&
                !string.Equals(library.LibraryType, "package", StringComparison.OrdinalIgnoreCase) &&
                !string.Equals(library.LibraryType, "referenceassembly", StringComparison.OrdinalIgnoreCase))
            {
                return false;
            }

            var refsPath = Path.Combine(_basePath, "refs");
            var hasRefs = _fileSystem.Directory.Exists(refsPath);

            // Resolving packages and reference assebmlies requires refs folder to exist
            if (!isProject && !hasRefs)
            {
                return false;
            }

            var directories = new List<string>()
            {
                _basePath
            };

            if (hasRefs)
            {
                directories.Insert(0, refsPath);
            }

            foreach (var assembly in library.Assemblies)
            {
                bool resolved = false;
                var assemblyFile = Path.GetFileName(assembly);
                foreach (var directory in directories)
                {
                    string fullName;
                    if (ResolverUtils.TryResolveAssemblyFile(_fileSystem, directory, assemblyFile, out fullName))
                    {
                        assemblies.Add(fullName);
                        resolved = true;
                        break;
                    }
                }

                if (!resolved)
                {
                    throw new InvalidOperationException(
                        $"Can not find assembly file {assemblyFile} at '{string.Join(",", directories)}'");
                }
            }

            return true;
        }
 public bool TryResolveAssemblyPaths(CompilationLibrary library, List<string> assemblies)
 {
     foreach (var resolver in _resolvers)
     {
         if (resolver.TryResolveAssemblyPaths(library, assemblies))
         {
             return true;
         }
     }
     return false;;
 }
示例#35
0
 internal static IEnumerable<string> ResolveFromPackagePath(IFileSystem fileSystem, CompilationLibrary library, string basePath)
 {
     foreach (var assembly in library.Assemblies)
     {
         string fullName;
         if (!TryResolveAssemblyFile(fileSystem, basePath, assembly, out fullName))
         {
             throw new InvalidOperationException($"Can not find assembly file for package {library.Name} at '{fullName}'");
         }
         yield return fullName;
     }
 }
        public bool TryResolveAssemblyPaths(CompilationLibrary library, List<string> assemblies)
        {
            if (string.IsNullOrEmpty(_nugetPackageDirectory) ||
                !string.Equals(library.Type, "package", StringComparison.OrdinalIgnoreCase))
            {
                return false;
            }

            string packagePath;

            if (ResolverUtils.TryResolvePackagePath(_fileSystem, library, _nugetPackageDirectory, out packagePath))
            {
                assemblies.AddRange(ResolverUtils.ResolveFromPackagePath(_fileSystem, library, packagePath));
                return true;
            }
            return false;
        }
 public bool TryResolveAssemblyPaths(CompilationLibrary library, List<string> assemblies)
 {
     if (!string.Equals(library.LibraryType, "referenceassembly", StringComparison.OrdinalIgnoreCase))
     {
         return false;
     }
     foreach (var assembly in library.Assemblies)
     {
         string fullName;
         if (!TryResolveReferenceAssembly(assembly, out fullName))
         {
             throw new InvalidOperationException($"Can not find reference assembly '{assembly}' file for package {library.PackageName}");
         }
         assemblies.Add(fullName);
     }
     return true;
 }
 public DependencyContext Create(
     string target = null,
     string runtime = null,
     bool? isPortable = null,
     CompilationOptions compilationOptions = null,
     CompilationLibrary[] compileLibraries = null,
     RuntimeLibrary[] runtimeLibraries = null,
     IReadOnlyList<KeyValuePair<string, string[]>> runtimeGraph = null)
 {
     return new DependencyContext(
                     target ?? string.Empty,
                     runtime ?? string.Empty,
                     isPortable ?? false,
                     compilationOptions ?? CompilationOptions.Default,
                     compileLibraries ?? new CompilationLibrary[0],
                     runtimeLibraries ?? new RuntimeLibrary[0],
                     runtimeGraph ?? new KeyValuePair<string, string[]>[0]
                     );
 }
 public DependencyContext Create(
     string target = null,
     string runtime = null,
     bool? isPortable = null,
     CompilationOptions compilationOptions = null,
     CompilationLibrary[] compileLibraries = null,
     RuntimeLibrary[] runtimeLibraries = null,
     IReadOnlyList<RuntimeFallbacks> runtimeGraph = null,
     string runtimeSignature = null)
 {
     return new DependencyContext(new TargetInfo(
                     target ?? "DefaultTarget",
                     runtime ?? string.Empty,
                     runtimeSignature ?? string.Empty,
                     isPortable ?? false),
                     compilationOptions ?? CompilationOptions.Default,
                     compileLibraries ?? new CompilationLibrary[0],
                     runtimeLibraries ?? new RuntimeLibrary[0],
                     runtimeGraph ?? new RuntimeFallbacks[0]
                     );
 }
        public bool TryResolveAssemblyPaths(CompilationLibrary library, List<string> assemblies)
        {
            var isProject = string.Equals(library.Type, "project", StringComparison.OrdinalIgnoreCase) ||
                string.Equals(library.Type, "msbuildproject", StringComparison.OrdinalIgnoreCase);

            var isPackage = string.Equals(library.Type, "package", StringComparison.OrdinalIgnoreCase);
            if (!isProject &&
                !isPackage &&
                !string.Equals(library.Type, "referenceassembly", StringComparison.OrdinalIgnoreCase))
            {
                return false;
            }

            var refsPath = Path.Combine(_basePath, RefsDirectoryName);
            var isPublished = _fileSystem.Directory.Exists(refsPath);

            // Resolving reference assebmlies requires refs folder to exist
            if (!isProject && !isPackage && !isPublished)
            {
                return false;
            }

            var directories = new List<string>()
            {
                _basePath
            };

            if (isPublished)
            {
                directories.Insert(0, refsPath);
            }

            // Only packages can come from shared runtime
            var sharedPath = _dependencyContextPaths.SharedRuntime;
            if (isPublished && isPackage && !string.IsNullOrEmpty(sharedPath))
            {
                var sharedDirectory = Path.GetDirectoryName(sharedPath);
                var sharedRefs = Path.Combine(sharedDirectory, RefsDirectoryName);
                if (_fileSystem.Directory.Exists(sharedRefs))
                {
                    directories.Add(sharedRefs);
                }
                directories.Add(sharedDirectory);
            }

            foreach (var assembly in library.Assemblies)
            {
                bool resolved = false;
                var assemblyFile = Path.GetFileName(assembly);
                foreach (var directory in directories)
                {
                    string fullName;
                    if (ResolverUtils.TryResolveAssemblyFile(_fileSystem, directory, assemblyFile, out fullName))
                    {
                        assemblies.Add(fullName);
                        resolved = true;
                        break;
                    }
                }

                if (!resolved)
                {
                    // throw in case when we are published app and nothing found
                    // because we cannot rely on nuget package cache in this case
                    if (isPublished)
                    {
                    throw new InvalidOperationException(
                        $"Can not find assembly file {assemblyFile} at '{string.Join(",", directories)}'");
                }
                    return false;
            }
            }

            return true;
        }