WinUI 3 非打包应用瘦身咨询:能否移除指定文件/文件夹
当前优化是否已达最优?
还没到最优,还有不少可以进一步压缩文件数量和体积的空间,下面逐个分析你提到的文件能否移除,再补充额外优化方案。
各文件能否移除?
A.deps.json 和 A.runtimeconfig.json:绝对不能删。这两个是.NET 5+(WinUI3基于此)应用的核心配置文件:
A.runtimeconfig.json告诉系统应用需要哪个版本的.NET运行时,以及运行时的配置参数;A.deps.json记录了应用的依赖树,包括B、C DLL和.NET框架依赖,运行时靠它来定位和加载依赖文件。
不管是框架依赖还是自包含部署,这两个文件都是运行必需的,删了应用直接启动失败。
Assets文件夹:看实际使用情况。如果你的应用完全没用到里面的资源(比如默认的图标、启动图、示例图片等),可以直接删除;但如果代码里有引用Assets里的文件(比如窗口图标、界面图片),删了会导致资源加载失败,这种情况就必须保留用到的文件,删掉没用的。
.pri文件:这是Windows资源索引文件,用来快速查找应用的资源(字符串、本地化内容、图片等)。如果你的应用已经移除了所有资源文件和资源引用,没有任何需要加载的资源,可以尝试删除;但如果还有资源引用(哪怕是默认的应用名称、图标这类),删了会导致应用崩溃或者资源显示异常,建议保留除非你确认完全没用。
额外优化方案(进一步减少文件数量)
启用发布裁剪和单文件发布:在发布时添加以下MSBuild参数:
-p:PublishTrimmed=true -p:PublishSingleFile=truePublishTrimmed会裁剪掉应用未使用的.NET框架代码和依赖,减少文件体积和数量;PublishSingleFile可以把所有依赖(包括B、C DLL和必要的运行时文件)打包到A.exe里,注意WinUI3非打包应用用单文件可能有兼容性问题,需要充分测试。
合并依赖DLL:用ILRepack这类工具把B、C DLL合并到A.exe中,这样输出就只有A.exe加上必需的配置文件,大幅减少文件数量。注意合并前要测试应用功能是否正常,避免依赖冲突。
清理不必要的NuGet依赖:检查解决方案中是否有未使用的NuGet包,特别是WinUI3相关的可选依赖,移除后可以减少输出文件。
调整项目配置:在A项目文件中添加
<PublishReadyToRun>true</PublishReadyToRun>,提前编译.NET代码为原生代码,既可以提升启动速度,也能减少运行时的JIT编译依赖,优化整体体积。
内容的提问来源于stack exchange,提问作者Ming

