C#winform将DLL嵌入exe
- 1 项目引入DLL
- 1.1 项目-鼠标右击-点击添加引用;
- 1.2 点击“浏览”;
- 1.3 添加选中DLL
- 1.4 勾选引入的DLL,点击“确定”
- 1.5 添加成功后
- 2 DLL嵌入exe
- 2.1 打开引入DLL属性窗口
- 2.2 将“复制本地”项设为“false”
- 2.3 双击打开“Resources.resx”
- 2.4 选择添加资源-添加现有文件
- 2.5 添加DLL至资源
- 2.6 Main函数中添加如下代码
在软件开发的过程中不可避免需要引用第三方类库或自定义类库(DLL), 引用的DLL一般在生成项目时会拷贝至Debug或Release目录中, 造成生成目录中文件繁多的问题,鉴于此现象希望将DLL封装在项目的exe文件中。
好了,话不多说,上菜~~~~~~~~~~
1 项目引入DLL
- 如果您是高手,可以跳过“标题1”内容,直接查看DLL如何嵌入exe即可(“标题2”);
- 这里添加DLL选择任何路径即可,无需关心原DLL的路径。
1.1 项目-鼠标右击-点击添加引用;
1.2 点击“浏览”;
1.3 添加选中DLL
这里以《Toolkit.dll》为例演示
1.4 勾选引入的DLL,点击“确定”
1.5 添加成功后
2 DLL嵌入exe
2.1 打开引入DLL属性窗口
在引用列表,找到引入的DLL,右击-属性
2.2 将“复制本地”项设为“false”
2.3 双击打开“Resources.resx”
2.4 选择添加资源-添加现有文件
2.5 添加DLL至资源
在弹出的对话框中,找到2.2中操作的DLL,然后点击“打开”
2.6 Main函数中添加如下代码
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
private static System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
string info = args.Name;
string strDllName = string.Empty;
if (info.Contains(','))
{
strDllName = info.Split(',').First();
}
else
{
int index = info.IndexOf(".dll", StringComparison.Ordinal);
if (index >= 0) strDllName = info.Remove(index);
}
if (strDllName.EndsWith(".resources")) return null;
string baseName = $"{typeof(Program).Namespace}.Properties.Resources";
var assembly = System.Reflection.Assembly.GetExecutingAssembly();
var rm = new System.Resources.ResourceManager(baseName, assembly);
byte[] bytes = (byte[])rm.GetObject(strDllName);
return System.Reflection.Assembly.Load(bytes);
}