.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 验证就行。

相关推荐
这个DBA有点耶2 小时前
NULL不是空——数据库里最反直觉的设计,90%新人踩过的坑
数据库·mysql·代码规范
这个DBA有点耶4 小时前
AI写的SQL跑崩了生产库,这锅谁背?
数据库·人工智能·程序员
镜舟科技4 小时前
Databricks 再提 LTAP,AI 时代的数据底座为何重回大一统叙事?
数据库·架构·agent
Databend5 小时前
从湖仓升级为 Agent 时代的数据控制面,Snowflake 和 Databricks 有哪些布局
大数据·数据库·agent
ClouGence8 小时前
SQL Server CDC 能放到 Always On 备库读吗?一文讲透原理与实践
数据库·sql server
你好潘先生10 小时前
别再记命令了,用 yeero do 说句人话就能跑脚本,而且不烧 token
服务器·python·命令行
先吃饱再说1 天前
存储的进化:从 MySQL 到浏览器缓存,数据到底住在哪?
数据库
Nturmoils1 天前
字段太多看不全,ksql 的展开模式和输出控制怎么用
数据库·后端
Databend1 天前
Agent 轨迹分析与归因的数据工程实践
大数据·数据库·agent
这个DBA有点耶1 天前
SQL改写进阶:标量子查询的“隐形代价”与消除实战
数据库·mysql·架构