Beispiel #1
0
        public static string GetAssemblyFile(string assembly, Version version, DotNetFramework framework, GACFolders folders, string[] customSearchDirs = null)
        {
            var nugetVersion = version.MinorRevision <= 0
                ? $"{version.Major}.{version.Minor}.{version.Build}"
                : $"{version.Major}.{version.Minor}.{version.Build}.{version.Revision}";

            if (customSearchDirs != null)
            {
                foreach (var libDir in customSearchDirs)
                {
                    var file = $"{libDir}/{assembly}.dll";
                    if (File.Exists(file))
                    {
                        return(file);
                    }
                }
            }

            if (folders.HasFlag(GACFolders.NuGet))
            {
                var libDir = $"{UserProfileFolder}/.nuget/packages/{assembly}/{nugetVersion}/lib";
                if (Directory.Exists(libDir))
                {
                    var libTFMs = Directory.GetDirectories(libDir).Select(x => Path.GetFileName(x));
                    var libTFM  = framework.CompatibilityFrameworks.FirstOrDefault(x => libTFMs.Contains(x.TFM));
                    if (libTFM != null)
                    {
                        var file = $"{libDir}/{libTFM.TFM}/{assembly}.dll";
                        if (File.Exists(file))
                        {
                            return(file);
                        }
                    }
                }
            }
            if (folders.HasFlag(GACFolders.SDK))
            {
                var libDir = $"{ProgramFilesFolder}/dotnet/sdk/NuGetFallbackFolder/{assembly}/{nugetVersion}/lib";
                if (Directory.Exists(libDir))
                {
                    var libTFMs = Directory.GetDirectories(libDir).Select(x => Path.GetFileName(x));
                    var libTFM  = framework.CompatibilityFrameworks.FirstOrDefault(x => libTFMs.Contains(x.TFM));
                    if (libTFM != null)
                    {
                        var file = $"{libDir}/{libTFM.TFM}/{assembly}.dll";
                        if (File.Exists(file))
                        {
                            return(file);
                        }
                    }
                }
            }
            if (folders.HasFlag(GACFolders.Shared))
            {
                var searchDirs = Directory.GetDirectories($"{ProgramFilesFolder}/dotnet/shared");
                switch (framework.Abbreviation)
                {
                case "netcoreapp":
                    foreach (var libDir in searchDirs)
                    {
                        var _version = Directory.GetDirectories(libDir)
                                       .Select(x => new Version(Path.GetFileName(x)))
                                       .Where(v => v >= framework.Version)
                                       .Min();

                        if (_version != null)
                        {
                            var file = $"{libDir}/{_version}/{assembly}.dll";
                            if (File.Exists(file))
                            {
                                return(file);
                            }
                        }
                    }
                    break;

                default:
                    throw new NotSupportedException("Only netcoreapp is supported.");
                }
            }
            return(null);
        }
Beispiel #2
0
        public static ResolveEventHandler CreateAssemblyResolver(Assembly assembly, string targetFramework, GACFolders folders, string[] customSearchDirs = null)
        {
            var refAssemblies = assembly.GetReferencedAssemblies();
            var framework     = DotNetFramework.Parse(targetFramework);

            return(new ResolveEventHandler((sender, args) =>
            {
                var regex = new Regex("([^,]+), Version=([^,]+), Culture=[^,]+, PublicKeyToken=.+");
                var match = regex.Match(args.Name);

                var assembly = match.Groups[1].Value;
                var version = new Version(match.Groups[2].Value);
                var useAssembly = refAssemblies.FirstOrDefault(x => x.Name == assembly);

                string dll;
                if (useAssembly != null)
                {
                    dll = GetAssemblyFile(useAssembly.Name, useAssembly.Version, framework, folders, customSearchDirs);
                }
                else
                {
                    dll = GetAssemblyFile(assembly, version, framework, folders, customSearchDirs);
                }

                return Assembly.LoadFile(dll);
            }));
        }