C# 写一个打包exe 的工具
时间: 2023-09-23 11:08:53 浏览: 189
C#打包成exe文件工具
4星 · 用户满意度95%
以下是一个使用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文件的默认程序。
阅读全文