如何将C# .NET Core 2.0控制台应用打包为单一.exe文件?
将.NET Core 2.0控制台应用打包为单一EXE的方案
当然可以实现!不过因为你用的是.NET Core 2.0,这个版本还没有官方原生的单文件发布功能,得靠一些第三方工具或者小技巧来搞定。下面给你两个经过验证的实用方案,完美适配你“多工具放同一文件夹、通过系统路径直接调用”的需求:
方案一:使用ILMerge合并程序集
ILMerge是微软官方推出的程序集合并工具,能把你的主EXE和所有依赖的.NET DLL打包成一个独立文件:
首先通过NuGet包管理器安装ILMerge:
Install-Package ILMerge先执行你原本的发布命令生成基础文件:
dotnet publish -c Release -r win10-x64打开命令行,切换到发布输出目录(一般是
bin/Release/netcoreapp2.0/win10-x64/publish),运行ILMerge命令:ILMerge.exe /target:winexe /out:YourSingleApp.exe YourOriginalApp.exe *.dll/target:winexe:指定输出为Windows控制台应用类型YourSingleApp.exe:替换成你想要的最终单文件名YourOriginalApp.exe:替换成发布生成的原主程序文件名
执行完成后,你就得到了一个包含所有依赖的单一EXE。
注意:ILMerge无法合并非托管DLL(比如基于C++编译的原生依赖),如果你的应用有这类文件,需要单独将它们放在EXE同目录下,或者额外处理。
方案二:使用Costura.Fody自动嵌入依赖
Costura.Fody是一个非常流行的Fody插件,它能在编译时自动把所有依赖DLL嵌入到主程序集里,运行时再动态提取使用,步骤更省心:
- 通过NuGet安装Costura.Fody:
Install-Package Costura.Fody - 安装完成后,不需要额外配置,直接执行发布命令:
dotnet publish -c Release -r win10-x64 - 发布完成后,你会发现主EXE的体积明显变大——它已经包含了所有依赖的.NET DLL,直接复制这个EXE到目标文件夹就能运行,不需要其他附属文件。
补充:如果你的应用包含非托管DLL,Costura也支持嵌入,但需要在项目根目录的
FodyWeavers.xml文件中添加相应配置,不过纯.NET依赖的场景下,默认配置就够用了。
额外提示
如果之后你升级到.NET Core 3.0及以上版本,就可以直接使用官方原生的单文件发布功能,命令如下:
dotnet publish -c Release -r win10-x64 /p:PublishSingleFile=true
但针对你当前的.NET Core 2.0环境,上面两个方案是最靠谱的选择。
内容的提问来源于stack exchange,提问作者Guerrilla




