.NET 8 单文件发布:把 exe 和一堆 dll 打进一个文件里

用 .NET 8 发布应用的时候,如果直接默认发布,会出来一个 exe 外加一大串 dll。给到别人或者丢到服务器上,看着就乱,复制部署也容易漏文件。单文件发布就是把所有这些打包成一个 exe,干净很多。两种方式都能搞,一个是在 VS2022 里点一点,一个是直接用 dotnet publish 命令。

在 VS2022 里操作的话,右键项目选"属性",切到发布那个 tab。

新建一个发布配置文件,或者编辑已有的。部署模式选"独立"(Self-contained),这样会把 .NET 运行时自己也带进去,目标机器上不用装运行时。然后勾上"生成单个文件"。还有个 ReadyToRun 的选项,勾上启动会快一点,代价是生成的文件会更大,按需勾就行。保存后点发布,出来的就是一个单独的大 exe。

如果习惯直接改 csproj 文件,加这几行就可以:

复制代码
<PropertyGroup>
  <OutputType>Exe</OutputType>
  <TargetFramework>net8.0</TargetFramework>
  <PublishSingleFile>true</PublishSingleFile>
  <SelfContained>true</SelfContained>
  <RuntimeIdentifier>win-x64</RuntimeIdentifier>
</PropertyGroup>

这几项一设,后面不管是用 VS 发布还是 dotnet publish,都会走单文件模式。

命令行发布更直接一点,在项目根目录下跑:

复制代码
dotnet publish -c Release -r win-x64 --self-contained true -p:PublishSingleFile=true

生成的单文件在 bin/Release/net8.0/win-x64/publish/ 下面。跑的时候直接双击那个 exe 就行。

踩过的一些坑说一下。

VS2022 里找不到"生成单个文件"这个选项的情况,有人遇到过。多半是项目类型或者目标框架不对,确认是控制台应用、目标框架是 net8.0。

如果界面上还是没有,直接在 csproj 里手写配置反而更稳,界面只是帮你改文件而已。

发布出来文件大得夸张。因为独立模式下把整个运行时都包进去了,trim 没开的话几百兆很正常。如果目标机器上确定装了 .NET 8 运行时,可以把 SelfContained 设成 false,走框架依赖模式,文件会小很多。但这时候你得保证环境里有正确的运行时,否则跑不起来。另一个思路是排查下引用的包,有些间接依赖可能根本没用上,能砍就砍。

调试信息的问题。单文件发布默认会把 pdb 剥离掉,导致出问题的时候不好定位。如果是在 debug 阶段,就不要开单文件发布了,或者手动把 pdb 拷过去用。

线上排查的话,可以考虑保留符号文件,或者用其他日志手段辅助。

另外,发布时指定的 RID(比如 win-x64)必须和目标机器匹配,否则拷过去双击没反应或者报错。Linux 下一般是 linux-x64,别弄混。

完整走一遍的话,创建一个控制台项目:

lcjmSSL不仅帮你申请证书,更帮你自动部署。证书签发后,系统可自动将证书部署到你的服务器或应用中,无需手动下载、上传、配置。同时开放API与回调接口,方便你将部署流程集成到自有运维体系中,实现真正的端到端自动化。

复制代码
dotnet new console -n SingleFileDemo
cd SingleFileDemo

改一下 csproj 加上前面的单文件配置,然后:

复制代码
dotnet publish -c Release

运行 ./bin/Release/net8.0/win-x64/publish/SingleFileDemo.exe 验证就行。

相关推荐
cmes_love2 小时前
期货五档tick数据下载教程期权五档高频历史数据以及分钟量化回测下载
数据库
hikktn2 小时前
Excel 日期格式统一治理:从“显示不全“到“自动兼容“的完整方案
windows·python·excel
蚂蚁数据AntData2 小时前
从ChatBI到业务记忆:重新定义数据智能的生产力边界
大数据·网络·数据库·人工智能·算法
Quincy_Freak2 小时前
技术随笔|银河麒麟aarch64内网轻量数据分析工具 SQLiteGo 使用体验
大数据·数据库·数据挖掘·数据分析·sqlite·银河麒麟·aarch64
Amnesia0_02 小时前
MySQL视图和用户管理
数据库·mysql
唐墨1232 小时前
关于linux kernel错误码为负数编码这件事情,我个人的一些看法
linux·运维·服务器
matrixmind12 小时前
aiomysql:异步场景下的 MySQL 驱动
android·数据库·mysql·其他
数据库小学妹2 小时前
时序数据怎么存?InfluxDB、TDengine、TimescaleDB与国产融合方案选型实战
大数据·数据库·经验分享·时序数据库·dba
caimouse2 小时前
Reactos 第 6 章 进程间通信 — 6.8 本地过程调用(LPC)与 6.9 视窗报文(Message)
windows