在 C# 中,将 DLL 文件打包到 EXE 文件中可以使用 ILRepack 工具。ILRepack 是一个开源的工具,可以合并多个 DLL 文件并将它们嵌入到一个 EXE 文件中,从而实现将 DLL 打包到 EXE 的功能。
以下是使用 ILRepack 工具打包 DLL 到 EXE 的步骤:
首先,在项目中使用 NuGet 包管理器将 ILRepack 安装到项目中。
在项目的输出文件夹中找到已编译的 EXE 文件和需要打包的 DLL 文件。
打开命令提示符(或 PowerShell),导航到已编译的 EXE 文件和 DLL 文件所在的文件夹。
在命令提示符中输入以下命令,并执行:
plaintextCopy code
ILRepack.exe /out:MergedApp.exe App.exe Lib1.dll Lib2.dll Lib3.dll ...
其中,
MergedApp.exe
是要生成的合并后的 EXE 文件的名称,App.exe
是原始的 EXE 文件名,Lib1.dll
,Lib2.dll
,Lib3.dll
是需要打包到 EXE 中的 DLL 文件名列表。
- 执行命令后,ILRepack 将会合并指定的 EXE 文件和 DLL 文件,并将合并后的文件保存为
MergedApp.exe
。完成以上步骤后,您将获得一个包含 DLL 文件的 EXE 文件。您可以运行该 EXE 文件,并使用其中的功能,无需再单独依赖 DLL 文件。请注意,此方法适用于.NET Framework 项目。对于 .NET Core 项目,可以使用 .NET Core 自带的
dotnet publish
命令进行类似的操作。
cd C:\Users\wuqimei\source\repos\FileConvertion\FileConvertion\bin\Release
ILRepack.exe /out:FileConvertionM.exe FileConvertion.exe Ude.NetStandard.dll
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Ude;
namespace FileConvertion
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button_SelectFolder_Click(object sender, EventArgs e)
{
textBox1.Text = "";
显示选择文件夹的对话框
//FolderBrowserDialog folderBrowserDialog = new FolderBrowserDialog();
//if (folderBrowserDialog.ShowDialog() == DialogResult.OK)
//{
// string folderPath = folderBrowserDialog.SelectedPath;
// this.Convertion(folderPath);
//}
this.Convertion(Environment.CurrentDirectory);
}
private void Log(string message)
{
textBox1.Text += message + "\r\n";
}
private void Form1_Load(object sender, EventArgs e)
{
//this.Convertion();
}
void Convertion(string folderPath = @"C:\Users\wuqimei\Desktop\Desktop")
{
//string folderPath = @"C:\Users\wuqimei\Desktop\Desktop";
Log("FolderPath:" + folderPath);
DirectoryInfo directoryInfo = new DirectoryInfo(folderPath);
int count = 0;
// 遍历文件夹下的所有文件
foreach (FileInfo fileInfo in directoryInfo.GetFiles())
{
string fileExtension = fileInfo.Extension.ToLower();
// 只处理LRC和TXT格式文件
if (fileExtension == ".lrc" || fileExtension == ".txt")
{
//DetectEncoding(fileInfo.FullName);
//DetectEncoding2(fileInfo.FullName);
Encoding encoding = DetectEncoding3(fileInfo.FullName);
if (encoding == null || encoding.EncodingName.Equals("简体中文(GB18030)"))
{
Log("默认File:" + fileInfo.FullName);
}
else
{
// 读取文件内容
string fileContent = File.ReadAllText(fileInfo.FullName);
// 将文件编码改为ANSI
File.WriteAllText(fileInfo.FullName, fileContent, Encoding.GetEncoding("gbk"));
Log("转换File:" + fileInfo.FullName);
}
count++;
}
}
Log("共有"+ count + "个相关文件,编码转换为ANSI:成功");
}
Encoding DetectEncoding(string filePath)
{
Encoding encoding = null;
using (FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read))
{
byte[] bom = new byte[4];
fileStream.Read(bom, 0, 4);
Log(Convert.ToString(bom[0], 16) + " " + Convert.ToString(bom[1], 16) + " " + Convert.ToString(bom[2], 16) + " " + Convert.ToString(bom[3], 16) + " ");
// 根据文件头部的字节序列判断编码
if (bom[0] == 0xef && bom[1] == 0xbb && bom[2] == 0xbf)
{
encoding= Encoding.UTF8;
}
else if (bom[0] == 0xfe && bom[1] == 0xff)
{
encoding = Encoding.Unicode; // UTF-16 Little Endian
}
else if (bom[0] == 0xff && bom[1] == 0xfe)
{
encoding = Encoding.BigEndianUnicode; // UTF-16 Big Endian
}
else if (bom[0] == 0 && bom[1] == 0 && bom[2] == 0xfe && bom[3] == 0xff)
{
encoding = Encoding.UTF32;
}
else
{
encoding = Encoding.Default;
}
Log("文件编码1:" + encoding.EncodingName);
return encoding;
}
}
Encoding DetectEncoding2(string filePath)
{
Encoding encoding2 = null;
using (StreamReader reader = new StreamReader(filePath, detectEncodingFromByteOrderMarks: true))
{
// 获取读取器的当前编码
encoding2 = reader.CurrentEncoding;
Log("文件编码2:"+encoding2.EncodingName);
}
return encoding2;
}
Encoding DetectEncoding3(string filePath)
{
Encoding encoding = null;
using (FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read))
{
// 创建字符集识别器
CharsetDetector detector = new CharsetDetector();
// 检测文件的字符编码
detector.Feed(fileStream);
detector.DataEnd();
if (detector.Charset != null)
{
//Log("文件编码3:" + detector.Charset);
encoding = Encoding.GetEncoding(detector.Charset);
}
else
{
//Log("无法识别文件的编码");
}
return encoding;
}
}
}
}