将dll文件与wpf合并为一个单独的.exe文件
将dll文件与wpf合并为一个单独的.exe文件
我目前正在进行一个项目,其中有很多依赖项。我希望像嵌入资源一样,将所有引用的dll文件编译到.exe文件中。我尝试过ILMerge,但它无法处理.xaml资源。
所以我的问题是:有没有办法将一个具有多个依赖项的WPF项目合并为单个.exe文件?
将多个dll合并到一个单独的WPF应用程序exe文件中的原因是为了简化部署和分发过程,以及减少对外部依赖的需求。下面是解决这个问题的方法:
1. 在.csproj文件中添加以下代码:
%(ReferenceCopyLocalPaths.DestinationSubDirectory)%(ReferenceCopyLocalPaths.Filename)%(ReferenceCopyLocalPaths.Extension)
2. 将Main Program.cs文件修改为以下内容:
[STAThreadAttribute] public static void Main() { AppDomain.CurrentDomain.AssemblyResolve += OnResolveAssembly; App.Main(); }
3. 添加OnResolveAssembly方法:
private static Assembly OnResolveAssembly(object sender, ResolveEventArgs args) { Assembly executingAssembly = Assembly.GetExecutingAssembly(); AssemblyName assemblyName = new AssemblyName(args.Name); var path = assemblyName.Name + ".dll"; if (assemblyName.CultureInfo.Equals(CultureInfo.InvariantCulture) == false) path = String.Format(@"{0}\{1}", assemblyName.CultureInfo, path); using (Stream stream = executingAssembly.GetManifestResourceStream(path)) { if (stream == null) return null; var assemblyRawBytes = new byte[stream.Length]; stream.Read(assemblyRawBytes, 0, assemblyRawBytes.Length); return Assembly.Load(assemblyRawBytes); } }
这是一个简洁的解决方案,不需要外部依赖。只需要按照以下三个步骤操作:
1. 编辑.csproj文件并粘贴提供的代码段
2. 创建一个.cs文件,粘贴提供的代码并自动解析缺失的程序集
3. 将启动对象更改为刚创建的文件
这个解决方案非常简洁,不需要外部依赖。唯一与其他人不同的是,我重写了App.OnStartup方法来挂钩AssemblyResolve,这样我就不需要一个新的启动对象。
在我的情况下,App.OnStartup()太晚注册OnAssemblyResolve,因为在调用OnStartup时,我的应用程序引用了一些额外的程序集。相反,我将OnAssemblyResolve注册放在了App()构造函数中,这样就解决了问题。
只是在这里我不知道如何将依赖项转换为EmbeddedResource。通过使用NuGet添加依赖项,我将它们一个个添加为链接到解决方案中的新文件夹中的文件,这样它们就会嵌入到输出可执行文件中。但是,它们仍然会被复制到输出文件夹中。我只是在部署过程中忽略它们。是否有更好的解决方案?
非常感谢!我必须稍作调整,但对于我的情况来说,这比获取或支付其他解决方案要好得多。
我已经使用了几年,但今天有四台计算机无法正常运行。有什么想法吗?
我无法使其工作。我正在尝试将Resources.fr文件与.exe文件一起包含。
问题的出现原因是希望将多个dll文件合并到一个单独的.exe文件中,以便简化应用程序的部署和分发,并提高应用程序的运行效率。然而,ILMerge等工具在合并WPF应用程序时存在一些限制和问题,无法完全满足需求。
解决方法是使用{smartassembly}或ILRepack等工具。{smartassembly}是一款商业工具,可以混淆或嵌入dll文件。ILRepack是一个开源替代品,支持大多数WPF情况下的合并操作。ILRepack相比ILMerge更加灵活易用,可以解决ILMerge无法解决的问题。
然而,ILRepack也存在一些限制,它无法让用户指定要合并的文件,而是限制在已检测到的文件范围内。这意味着一些资源dll文件(包含翻译字符串)仍然保持独立,导致最终生成的可执行文件仍然包含额外的dll文件。这与合并dll到一个可执行文件的初衷相悖。
合并dll文件到一个单独的.exe文件中的需求在WPF应用程序中存在一些挑战和限制。虽然可以使用{smartassembly}或ILRepack等工具来实现合并,但仍然无法完全满足最终的合并目标。