You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将.NET Core项目所有文件(不止DLL)打包为单个可执行文件?

嘿,我刚好折腾过.NET Core打包单EXE的需求,给你几个实用的方案,都是圈内常用的方法:

方案1:用.NET官方自带的单文件发布(首推)

这是微软官方支持的方式,操作简单还靠谱,分两种方式操作:

命令行方式

打开终端,进入你的项目目录,运行下面的命令:

dotnet publish -c Release -r win-x64 --self-contained true /p:PublishSingleFile=true /p:IncludeSymbolsInSingleFile=true
  • -c Release:指定用Release模式编译,性能更优
  • -r win-x64:指定目标运行时,比如Windows 64位用这个,Linux换成linux-x64,macOS用osx-x64
  • --self-contained true:把.NET Core运行时也打包进去,目标机器不用预装.NET环境就能跑
  • /p:PublishSingleFile=true:核心参数,告诉编译器生成单个EXE
  • /p:IncludeSymbolsInSingleFile=true:如果需要把PDB调试文件也嵌入进去,加上这个参数就行

Visual Studio图形界面方式

如果你习惯用VS操作:

  • 右键你的项目 → 选择「属性」
  • 切换到「发布」标签页,点击「新建」设置发布配置文件
  • 目标框架选对应版本,部署模式选「独立」
  • 勾选「生成单个文件」,目标运行时选你需要的平台
  • 最后点击「发布」,就能在输出目录得到单个EXE了
方案2:用Costura.Fody快速嵌入依赖(懒人福音)

这是一个第三方工具,安装后几乎不用额外配置就能自动把所有依赖DLL嵌入到EXE里,步骤超简单:

  1. 打开NuGet包管理器,搜索并安装Costura.Fody
  2. 正常编译你的项目,Release模式下生成的EXE就已经包含所有依赖DLL了
  3. 至于JSON这类配置文件,你需要把它们的「生成操作」改成「嵌入的资源」(右键文件→属性→生成操作),然后在代码里用下面的方式读取:
using System.Reflection;

var assembly = Assembly.GetExecutingAssembly();
using var stream = assembly.GetManifestResourceStream("你的项目命名空间.文件名.json");
// 然后读取stream里的内容即可
方案3:用ILMerge自定义打包(适合精细控制场景)

如果你需要更灵活的打包规则,可以用ILMerge,现在有适配.NET Core的版本:

  1. 安装NuGet包ILMerge.MSBuild.Tasks
  2. 编辑你的.csproj文件,添加下面的配置:
<PropertyGroup>
  <ILMergeOutputFile>$(OutputPath)\你的程序名.exe</ILMergeOutputFile>
  <ILMergeInputAssemblies>$(OutputPath)\你的程序名.exe;$(OutputPath)\依赖1.dll;$(OutputPath)\依赖2.dll</ILMergeInputAssemblies>
  <ILMergeTargetPlatformVersion>net6.0</ILMergeTargetPlatformVersion> <!-- 改成你的目标框架版本 -->
</PropertyGroup>
  1. 编译项目后,ILMerge会自动把指定的程序集合并成单个EXE
注意事项
  • 不管用哪种方法,如果你要嵌入JSON、XML这类非DLL文件,都需要把它们设为「嵌入的资源」,然后通过程序集读取,不能再用原来的文件路径读取了
  • 单文件发布模式下,程序运行时会把依赖临时解压到临时目录,对用户来说是完全透明的,不用担心性能问题

内容的提问来源于stack exchange,提问作者Hasan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:18:46