如何将文件合并到单个可执行文件或减少分布式文件的数量

我有我的WPF应用程序的输出文件:

de\ es\ fr\ hu\ it\ pt-BR\ Resources\ ro\ ru\ sv\ zh-Hans\ FileHelpers.dll FileHelpers.DataLink.dll FileHelpers.ExcelStorage.dll Interop.Excel.dll Interop.Office.dll Ionic.Zip.dll wpftoolkit.dll Xceed.Wpf.AvalonDock.dll Xceed.Wpf.AvalonDock.Themes.Aero.dll Xceed.Wpf.AvalonDock.Themes.Metro.dll Xceed.Wpf.AvalonDock.Themes.VS2010.dll Xceed.Wpf.DataGrid.dll Xceed.Wpf.Toolkit.dll MyApp.Common.Extensions.dll MyApp.Common.Helpers.dll MyApp.Common.Types.Attributes.dll MyApp.Security.dll MyApp.Wpf.Controls.dll MyApp.exe MyApp.exe.config licence.key error.log 

MyApp开始的一切都是由我自己开发的,其他一切由3dParty完成我想分发我的应用程序,但为了做到这一点,我想合并所有可能的东西,以分发最小的文件数量。

我试图使用ilmerge将我的文件合并为单个文件但是收到错误:

ILMerge.Merge: ERROR!!: Duplicate type 'XamlGeneratedNamespace.GeneratedInternal TypeHelper' found in assembly 'Xceed.Wpf.DataGrid'. 关于我在这里找到的那​​个问题的答案xeed错误原因我正在阅读ilmerge限制和汇编作为资源Jeffrey Richter

所以我发现杰弗里里希特解决方案非常有用。 但我无法将其应用于我的程序,因为程序集上没有“Build Action”属性。

为了实现我的目标,我能做些什么吗?

在此处输入图像描述

看看RedGate的SmartAssembly。

为了使Jeffrey的想法发挥作用,您应该将您的程序集添加为参考。 只需将dll添加为现有项目(右键单击project-> Add-> Existing Item)到项目中,您就会获得Build Action属性。 还要在添加为嵌入资源的引用上将Copy local property设置为false

在此处输入图像描述

App类构造函数:

 public partial class App : Application { public App() { AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve; } static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) { var dllName = new AssemblyName(args.Name).Name + ".dll"; var execAsm = Assembly.GetExecutingAssembly(); var resourceName = execAsm.GetManifestResourceNames().FirstOrDefault(s => s.EndsWith(dllName)); if (resourceName == null) return null; using (var stream = execAsm.GetManifestResourceStream(resourceName)) { var assbebmlyBytes = new byte[stream.Length]; stream.Read(assbebmlyBytes, 0, assbebmlyBytes.Length); return Assembly.Load(assbebmlyBytes); } } } 

请注意,此方法比通常的dll加载消耗更多内存。