一、NuGet包实现(方便)

[!过程简介:]
在VS2019中通过NuGet安装ILmerge和MSBuild.ILMerge.Task。在程序编译时,这两个插件直接自动将exe和dll打包成一个exe放置在debug或release文件夹中,或者将dll合成一个dll。

1.在工具菜单中打开NuGet包管理器

image.png

2.搜索ILmerge和MSBuild.ILMerge.Task,点击安装即可。
image.png

3.重新生成或者Debug或Release下启动,就可以在bin文件下找到EXE文件.

参考:
Fody.Costura 合并成一个Exe(附加的依赖包较多,不推荐) :https://blog.csdn.net/mysouling/article/details/52397463?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_title~default-0.pc_relevant_default&spm=1001.2101.3001.4242.1&utm_relevant_index=3

二、代码实现(简单)

参考:https://www.codeproject.com/Articles/528178/Load-DLL-From-Embedded-Resource

  1. 需要引用的dll文件复制到项目根目录,添加到项目中;
    image.png

  2. 设置dll文件属性生成操作嵌入式资源复制到输出目录不复制
    image.png

  3. 引用项目根目录的dll文件;

    image.png

  4. 设置Program.cs文件main方法;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
static void Main(){
//当程序集(Assembly)通过反射加载失败的时候会触发AssemblyResolve
AppDomain.CurrentDomain.AssemblyResolve += (sender, args) =>{
//InstallWindowsServer 这个是主程序的命名空间(调用websocket dll程序的命名空间)
string resourceName = "InstallWindowsServer." + new AssemblyName(args.Name).Name + ".dll";
using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName))
{
Byte[] assemblyData = new Byte[stream.Length];
stream.Read(assemblyData, 0, assemblyData.Length);
return Assembly.Load(assemblyData);
}
};
......
}
  1. 程序代码中正常编写。