将WinForm程序(含多个非托管Dll)合并成一个exe的方法

Posted lonelyxmas

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将WinForm程序(含多个非托管Dll)合并成一个exe的方法相关的知识,希望对你有一定的参考价值。

原文:将WinForm程序(含多个非托管Dll)合并成一个exe的方法

开发程序的时候经常会引用一些第三方的DLL,然后编译生成的exe文件就不能脱离这些DLL独立运行了。

ILMerge能把托管dll跟exe合并起来生成一个新的exe,但是当我们在项目中使用了非托管的dll,也就是使用了第三方dll时,合并虽然成功但是却无法运行,提示“不是有效的win32应用程序

这时候我们需要用到一款名为Fody.Costura的工具。Fody.Costura是一个Fody框架下的插件,可通过Nuget安装到VS工程中。安装之后,就可以将项目所依赖的DLL(甚至PDB)文件全部打包到EXE文件里

使用方法

  1. 在VS中,通过Nuget为目标EXE工程安装Costura.Fody。
  2. 安装成功后重启vs,然后重新生成

技术图片

重新生成完成后,到项目的输出目录下找到新生成的EXE文件,你同时会发现输出目录下仍然存在那些DLL。不过不用担心,这个EXE已经能够独立运行了。你可以把这些DLL全部删除后再运行EXE试试。

另外,Fody.Costura还支持一些进阶的特性,例如:

  • 临时程序集文件:在运行EXE前自动,自动将DLL从EXE中解压到文件夹系统中,再通过常规的方式加载该DLL。
  • 合并非托管的DLL:Fody.Costura可以合并非托管的DLL,但是不会自动合。如果你的程序涉及非托管DLL,那么你需要通过修改Fody.Costura的配置文件来显示地告诉它你想合并哪些非托管的DLL。
  • 预加载DLL:Fody.Costura可以帮助你在程序启动时预先加载某些DLL,你甚至可以指定这些DLL的加载顺序。

以上这些进阶特性都需要你通过修改Fody.Costura的配置文件来实现,具体的操作步骤可以参考它的官方文档

以上是关于将WinForm程序(含多个非托管Dll)合并成一个exe的方法的主要内容,如果未能解决你的问题,请参考以下文章

把C#程序(含多个Dll)合并成一个Exe的超简单方法

利用Costura.Fody制作绿色单文件程序(C#程序(含多个Dll)合并成一个Exe)

CLR的执行模型(2):将托管模块合并成程序集

将Winform程序及dll打包成可执行的exe

Winform程序及dll打包成一个可执行的exe

ilmerge 可以将c++的dll合并吗