将所有依赖程序集合并到构建

时间:2016-11-10 15:59:23

标签: c# .net dll dll-injection

我一直在寻找如何将dll合并到项目输出exe。

我安装了 Vitevic Assembly Embedder ,但是在构建项目时,它仍会保留一些dll文件。

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

1 个答案:

答案 0 :(得分:0)

这就是我通常做的事情:

  1. 将所有dll存储在解决方案内的某个文件夹中(例如" libs")。
  2. 内部VS变更"构建行动"所有dll到"嵌入式资源" - 这将"存储" exe文件中的执行文件。
  3. 将此代码放在Main方法中,或者在使用任何外部程序集之前的任何位置:

    AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;

  4. 还有:

        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;
        }