Exe合并压缩:将dll等文件依赖压缩到一个exe中


1. 背景

如果exe对某些dll有依赖,并且dll无法打包进原始exe时(比如没有该exe的工程源码,或者懒得搭建一套 VS或Python环境),可以优化将exe文件和依赖的dll文件合并成一个最终的release.exe,

通常的简便做法是直接将exe与dll放入同一目录下作为软件发布,但是相关dll依赖会直接暴露出来,并且不方便迁移

压缩合并的优点是在不同机器调用只需一个exe,而不需要在同目录放入相关dll,有一个缺点是加载速度会比直接调用dll慢一些(因为启动前需要解压)

除了Dll文件依赖,任何exe有关的文件,比如icon、binary等,都可以通过这个方式打包到一个exe中


2. 压缩方法

这类压缩打包方法有很多,这里介绍利用WinRAR来压缩打包的方法:

或者也可以用国内一些类似压缩软件,

  • 下载后,选中exe和相关的依赖文件,(原始 .exe 与相关dll文件放在同一目录下)

在这里插入图片描述

  • 右键winRAR选择 “Add to archive”:添加到压缩文件中:

在这里插入图片描述


3. 配置自解压(SFX)选项

在弹出来的压缩选项中,进行如下配置:

  • 选中自解压文件 SFX (SelF-eXtracting) ,设置一个新的exe文件名,比如Release.exe

在这里插入图片描述

  • 在Advance选项中,选中SFX options 高级自解压选项

在这里插入图片描述

  • 设置解压之后要执行的文件:

在这里插入图片描述

  • 选中解压到临时文件夹,安静模式选择全部隐藏

在这里插入图片描述

  • 勾选解压并更新文件,覆盖所有文件

在这里插入图片描述

  • 最后设置下SFX exe的图标文件

在这里插入图片描述


4. 执行新的exe

点击确定后, 会在目录下生成合并后的Release.exe, 即可放到任何PC或者目录执行

在这里插入图片描述

原理:当双击运行新生成的Release.exe时,会生成一个临时文件夹,将所有的内容解压,并运行setup配置的.exe。当关闭程序时,这个临时文件夹就会删除。

该临时文件夹一般默认在C:\Users\xxx\AppData\Local\Temp\RarSFX0 目录。。

当然如果有工程源码,还是推荐通过工程方式打包到一个exe中,
比如Python通过PyInstaller 将DLL文件直接打包进exe, 可参考: https://howiexue.blog.csdn.net/article/details/129372320


博主热门文章推荐:

在这里插入图片描述

一篇读懂系列:

LoRa Mesh系列:

网络安全系列:

嵌入式开发系列:

AI / 机器学习系列:


  • 5
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在C#,可以使用以下两种方法将DLL文件打包到一个EXE程序: 1. 使用ILMerge工具 ILMerge是一个免费的工具,可以将多个.NET程序集合并一个程序集。你可以将所有的DLL文件EXE文件都放到同一个文件,然后使用ILMerge工具将它们合并一个EXE文件。 使用ILMerge的命令行如下: ``` ILMerge.exe /out:MyApp.exe MyApp.exe MyDll1.dll MyDll2.dll ``` 其,/out参数指定合并后的程序集名称,MyApp.exe是主程序集,MyDll1.dll和MyDll2.dll是要合并的程序集。 2. 使用Visual Studio的资源文件 另一种方法是将DLL文件作为资源文件嵌入到EXE程序。在Visual Studio,你可以将DLL文件添加到项目,然后设置它们的Build Action为Embedded Resource。 然后,在代码,你可以使用Assembly类来访问嵌入的资源。例如: ```csharp using System.Reflection; // 加载嵌入的DLL文件 Assembly assembly = Assembly.LoadFrom("MyApp.exe"); // 获取嵌入的资源流 Stream stream = assembly.GetManifestResourceStream("MyDll1.dll"); // 读取资源流的数据 byte[] buffer = new byte[stream.Length]; stream.Read(buffer, 0, buffer.Length); // 将数据加载到内存 Assembly dll = Assembly.Load(buffer); ``` 这个例子,MyApp.exe是主程序集,MyDll1.dll是嵌入的DLL文件。使用Assembly.LoadFrom方法加载主程序集,然后使用Assembly.GetManifestResourceStream方法获取嵌入的资源流。最后,使用Assembly.Load方法将数据加载到内存,这样就可以使用嵌入的DLL文件了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HowieXue

求打赏~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值