Exemplo n.º 1
0
        public void Merge(IEnumerable <string> assemblies, string outputPath)
        {
            var assembliesToMerge = assemblies?.ToList() ?? throw new ArgumentNullException(nameof(assemblies));

            var assemblyResolver = new DefaultAssemblyResolver();

            if (SearchDirectories != null)
            {
                foreach (var dir in SearchDirectories)
                {
                    assemblyResolver.AddSearchDirectory(dir);
                }
            }

            if (Verbose)
            {
                Console.WriteLine("Merging:");
                foreach (var include in assembliesToMerge)
                {
                    Console.WriteLine($" - {include}");
                }
            }

            var tempRoot = Path.Combine(Path.GetTempPath(), "Mono.ApiTools", "AssemblyMerger", Guid.NewGuid().ToString());

            if (InjectAssemblyNames)
            {
                if (!string.IsNullOrWhiteSpace(tempRoot) && !Directory.Exists(tempRoot))
                {
                    Directory.CreateDirectory(tempRoot);
                }

                assembliesToMerge = assembliesToMerge.ToList();

                for (int i = 0; i < assembliesToMerge.Count; i++)
                {
                    var ass  = assembliesToMerge[i];
                    var temp = Path.Combine(tempRoot, Guid.NewGuid().ToString() + ".dll");
                    InjectAssemblyName(assemblyResolver, ass, temp);
                    assembliesToMerge[i] = temp;
                }

                if (Verbose)
                {
                    Console.WriteLine("Temporary assemblies:");
                    foreach (var include in assembliesToMerge)
                    {
                        Console.WriteLine($" - {include}");
                    }
                }
            }

            var options = new RepackOptions
            {
                InputAssemblies   = assembliesToMerge.ToArray(),
                OutputFile        = outputPath,
                SearchDirectories = SearchDirectories.ToArray(),
                CopyAttributes    = true,
                AllowMultipleAssemblyLevelAttributes = true,
                LogVerbose = Verbose
            };

            options.AllowedDuplicateTypes.Add(InjectedAttributeFullName, InjectedAttributeFullName);

            var repacker = new ILRepack(options);

            repacker.Repack();

            if (InjectAssemblyNames)
            {
                if (Directory.Exists(tempRoot))
                {
                    try
                    {
                        Directory.Delete(tempRoot, true);
                    }
                    catch
                    {
                    }
                }
            }
        }
        public void Merge(string outputPath)
        {
            var assemblies = Assemblies;

            if (Program.Verbose)
            {
                Console.WriteLine("Merging:");
                foreach (var include in assemblies)
                {
                    Console.WriteLine($" - {include}");
                }
            }

            var tempRoot = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString());

            if (InjectAssemblyNames)
            {
                assemblies = assemblies.ToList();
                if (!Directory.Exists(tempRoot))
                {
                    Directory.CreateDirectory(tempRoot);
                }

                for (int i = 0; i < assemblies.Count; i++)
                {
                    var ass  = assemblies[i];
                    var temp = Path.Combine(tempRoot, Guid.NewGuid().ToString() + ".dll");
                    InjectAssemblyName(ass, temp);
                    assemblies[i] = temp;
                }

                if (Program.Verbose)
                {
                    Console.WriteLine("Temporary assemblies:");
                    foreach (var include in assemblies)
                    {
                        Console.WriteLine($" - {include}");
                    }
                }
            }

            var options = new RepackOptions
            {
                InputAssemblies   = assemblies.ToArray(),
                OutputFile        = outputPath,
                SearchDirectories = SearchDirectories.ToArray(),
                CopyAttributes    = true,
                AllowMultipleAssemblyLevelAttributes = true,
                LogVerbose = Program.Verbose
            };
            var repacker = new ILRepack(options);

            repacker.Repack();

            if (InjectAssemblyNames)
            {
                MergeAssemblyNameAttributes(outputPath);

                if (Directory.Exists(tempRoot))
                {
                    Directory.Delete(tempRoot, true);
                }
            }
        }