Windows下打包工具包为一个exe

1. 目的

很多时候,一个工具包有除了一个exe还有不少配置文件及dll库。如果只想给客户发布一个exe,要怎么办呢?使用静态编译,不使用dll,将资源编译到exe中,使用时再释放出来。这种方法比较麻烦,而且需要将资源释放到临时目录,针对一些有安全性的工具,安全性也不够。有没有简单又安全的方法呢?

2. WinRAR

WinRAR有自带自解压压缩格式,可以定制压缩解压过程,并且在解压之后运行指定程序。这样看起来,压缩一个工具包为一个exe,自解压直接运行,就相当于是一个独立的exe了。

2.1. UI操作

  1. 选中需要压缩的文件,点击右键 添加到压缩文件

  2. 常规选项中 勾选 创建自解压格式压缩文件
    在这里插入图片描述

  3. 高级选项中 点击自解压文件选项 进行自解压设置
    在这里插入图片描述

  4. 模式设置:解压到临时文件夹 防止文件存在时解压失败,安静模式隐藏解压过程
    在这里插入图片描述

  5. 解压后运行:点击后直接运行exe
    在这里插入图片描述

  6. 图标设置:
    在这里插入图片描述

2.2. 自动化脚本

echo off
set RAR_FILE="E:\Program Files\WinRAR\WinRAR.exe"
REM 源路径可以使用通配符
set PACK_SRC="J:\SPIDownloadTool\*"
rem 打包后生成exe的名字
set PACK_PATH=new_name.exe
rem 打包后生成exe的图标
set ICON_PATH="j:\main.ico"

rem 指定解压后启动的exe路径
echo Setup=j:\SPIDownloadTool\LibraMPTool.exe>info.txt
rem 指定解压到系统临时目录,在exe启动关闭后会自动删除,如果不指定TempMode,则解压到当前目录
echo TempMode>>info.txt
rem 指定静默模式,即自解压过程中不显示解压的过程
echo Silent=1 >>info.txt

%RAR_FILE% a -sfx %PACK_PATH% %PACK_SRC% -zinfo.txt -iicon%ICON_PATH%

del /F /Q info.txt

3. Enigma Virtual Box

WinRAR只是将文件解压到临时路径来执行。如果有更高要求,不希望释放到临时目录执行,希望完整释放到内存中来执行。可以使用Enigma Virtual Box。
Enigma Virtual Box是软件虚拟化工具,它可以将多个文件封装到应用程序主文件,从而制作成为单执行文件的绿色软件。它支持所有类型的文件格式,虚拟化后的软件不释放任何临时文件到您的硬盘,文件模拟过程仅在内存运行。

  1. 主程序
    指定主程序,输入的虚拟文件即以主程序为标准,其图标、版本信息都和主程序相同。
    在这里插入图片描述

  2. 相关文件
    一般选择文件夹递归,会递归加载所有文件。如果有其他需求,可以选择相应设置。
    在这里插入图片描述

Engine Virtual Box的虚拟文件系统有对应一个虚拟目录。除非有特殊需求,需要指定绝对路径,一般选择默认路径即可。

  1. 打包
    其他选项,一般默认即可。如果有注册表需求,选择注册表项进行虚拟注册表设置。最后点击打包,即可以生成单独一个exe.
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个使用C#编写的简单打包exe工具,它可以将一个或多个文件打包一个exe文件: ```csharp using System; using System.IO; using System.Linq; using System.Windows.Forms; using Microsoft.Win32; namespace ExePacker { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void btnPackage_Click(object sender, EventArgs e) { // 选择需要打包的文件 OpenFileDialog openFileDialog = new OpenFileDialog(); openFileDialog.Multiselect = true; if (openFileDialog.ShowDialog() == DialogResult.OK) { string[] fileNames = openFileDialog.FileNames; // 选择exe文件保存路径 SaveFileDialog saveFileDialog = new SaveFileDialog(); saveFileDialog.Filter = "Executable files (*.exe)|*.exe"; if (saveFileDialog.ShowDialog() == DialogResult.OK) { string outputPath = saveFileDialog.FileName; // 读取exe文件模板 byte[] templateBytes = File.ReadAllBytes(Application.ExecutablePath); int startIndex = (int)BitConverter.ToUInt32(templateBytes, 0x3c); byte[] stubBytes = templateBytes.Skip(startIndex).ToArray(); // 读取需要打包的文件 byte[][] fileBytes = new byte[fileNames.Length][]; for (int i = 0; i < fileNames.Length; i++) { fileBytes[i] = File.ReadAllBytes(fileNames[i]); } // 合并exe文件模板和需要打包的文件 byte[] newBytes = new byte[stubBytes.Length + fileBytes.Sum(x => x.Length)]; stubBytes.CopyTo(newBytes, 0); int offset = stubBytes.Length; foreach (byte[] fileByte in fileBytes) { fileByte.CopyTo(newBytes, offset); offset += fileByte.Length; } // 写入新的exe文件 File.WriteAllBytes(outputPath, newBytes); // 设置exe文件属性 Registry.SetValue(@"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.exe\OpenWithProgids", "ExePacker", new byte[0], RegistryValueKind.Binary); Registry.SetValue(@"HKEY_CLASSES_ROOT\ExePacker\shell\open\command", null, "\"" + outputPath + "\" \"%1\"", RegistryValueKind.String); MessageBox.Show("打包成功!"); } } } } } ``` 这个工具使用了当前程序作为exe文件模板,读取模板文件的前部分作为stub,然后将需要打包的文件依次拼接到stub后面,生成新的exe文件。生成的exe文件会在当前目录下,文件名由用户指定。同时,它还会设置新的exe文件的属性,使得它可以作为程序打开其他exe文件的默认程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值