.NET 5环境下如何将NuGet包及其依赖打包为单个可执行文件?
.NET 5 全依赖单文件打包解决方案
问题根因
你之前发布时残留DLL是因为缺少了SelfContained和IncludeAllContentForSelfExtract两个核心参数,.NET 5 默认的单文件发布不会主动把所有原生依赖、运行时文件都嵌入exe内。
两种实现方式
方式1:直接使用完整参数的发布命令
指定目标运行时+全嵌入参数即可,示例为Windows 64位环境打包,你可以根据需要替换运行时标识(比如linux-x64、osx-x64):
dotnet publish -c Release -r win-x64 /p:PublishSingleFile=true /p:SelfContained=true /p:IncludeNativeLibrariesInSingleFile=true /p:IncludeAllContentForSelfExtract=true /p:PublishTrimmed=true
PublishTrimmed参数会裁剪未使用的代码,可大幅降低最终exe体积,你当前180MB的依赖裁剪后通常可以降到50MB以内
方式2:提前配置csproj文件简化发布
在项目的.csproj文件的PropertyGroup节点中添加如下配置:
<PropertyGroup> <TargetFramework>net5.0</TargetFramework> <!-- 替换为你需要的目标运行时 --> <RuntimeIdentifier>win-x64</RuntimeIdentifier> <PublishSingleFile>true</PublishSingleFile> <SelfContained>true</SelfContained> <IncludeNativeLibrariesInSingleFile>true</IncludeNativeLibrariesInSingleFile> <IncludeAllContentForSelfExtract>true</IncludeAllContentForSelfExtract> <!-- 开启裁剪,不需要可以删掉 --> <PublishTrimmed>true</PublishTrimmed> <!-- 如果是WinForms/WPF项目可以加这个参数避免裁剪出错 --> <TrimMode>CopyUsed</TrimMode> </PropertyGroup>
配置完成后,只需要执行dotnet publish -c Release即可完成单文件打包。
Costura.Fody补充配置
如果你坚持使用Costura.Fody打包,需要修改FodyWeavers.xml配置,让它匹配所有依赖程序集:
<Weavers> <Costura> <IncludeAssemblies>.*</IncludeAssemblies> </Costura> </Weavers>
更推荐使用官方的单文件发布方案,兼容性、稳定性都优于第三方工具。
注意事项
- 单文件发布必须指定运行时标识,不能使用无特定运行时的可移植构建
- 如果你确定目标电脑已经安装了.NET 5运行时,可以把
SelfContained设为false,最终文件体积会进一步缩小 - 如果开启裁剪后程序运行报错,可以关闭
PublishTrimmed,或者配置裁剪规则排除EPPlus相关的程序集
内容的提问来源于stack exchange,提问作者bg117
相关产品推荐
相关产品推荐

