在生成时将所有相关程序集合并到Exe

本文关键字:程序集 合并 Exe | 更新日期: 2023-09-27 18:17:22

我一直在寻找从很长一段时间关于如何合并dll项目输出exe。

我安装了Vitevic Assembly Embedder,但是当项目被构建时,它仍然留下一些dll文件。

因为我听说ILMerge,但我找不到任何有用的支持。我需要一个可以合并所有dll的工具

在生成时将所有相关程序集合并到Exe

我通常是这样做的:

  1. 将所有dll存储在解决方案中的某个文件夹中(如"libs")。
  2. Inside VS将所有dll的"Build Action"更改为"Embedded Resource"-这将在exe中"存储"实际文件。
  3. 将此代码放在Main方法中,或者在使用任何外部程序集之前的任何地方:

    AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;

:

    private static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
    {
        var thisAssembly = Assembly.GetExecutingAssembly();
        var assemblyName = new AssemblyName(args.Name);
        var dllName = assemblyName.Name + ".dll";
        var resources = thisAssembly.GetManifestResourceNames().Where(s => s.EndsWith(dllName));
        if (resources.Any())
        {
            var resourceName = resources.First();
            using (var stream = thisAssembly.GetManifestResourceStream(resourceName))
            {
                if (stream == null) return null;
                var block = new byte[stream.Length];
                try
                {
                    stream.Read(block, 0, block.Length);
                    return Assembly.Load(block);
                }
                catch (IOException)
                {
                    return null;
                }
                catch (BadImageFormatException)
                {
                    return null;
                }
            }
        }
        return null;
    }