.NET6 + WPF Windows 桌面程序打包到 Microsoft Store 后体积巨大 10 MB -> 70 MB

2022-06-23 11:17:36 +08:00
 VShawn

最近把开源项目重构并从 NET Framework 4.8 升级到了 .NET6 ,开发体验良好。尤其是发布 exe 的时候很轻松。

EXE 发布

原本 NET Framework 4.8 发布 Exe 包的时候,需要打包一系列的 dll 文件

如图,.NET6 可以打包为一个 10MB 的单 exe 应用,非常方便 portable 版本的发布:

MSIX 发布

不过今天尝试发布为 msix 并更新到 Microsoft Store ,就遭到了背刺 :(

如下图,NT48 发布的包只需要 10 MB 左右,而 .NET6 发布的包则达到了惊人的 70 多 MB 。

我推测 .NET6 发布打包时默认以 self-contained 形式把 .NET6 运行时也打包到了应用里面。

现在搜索一圈也没找到怎么以 依赖框架 的形式发布 msix 包。

并且这个问题应该是从 NET CORE 时代一直延续至今的:

https://docs.microsoft.com/en-us/answers/questions/23463/how-to-reduce-the-size-of-a-msix-net-core-31-insta.html

吐槽

虽然能理解“为了隔离各个应用,所以给每个应用都打包好自己的运行时”这种做法,但 .NET6 作为微软自家的运行时,居然也要被隔离,不知道过几年 Windows 要是预装了 .NET6 运行时,那么微软商店中的软件是否还需要自带一份运行时呢?

话说回来,反正用户不管怎么样都要下载 70MB 的安装包了,那我干嘛不用 Electron 写桌面应用,虽然用户用着慢,但写 UI 快啊

吐槽完了,求个 star https://github.com/1Remote/PRemoteM

3288 次点击
所在节点    Windows
15 条回复
codehz
2022-06-23 12:00:04 +08:00
UWP 当然也是可以有外部依赖的(隔壁 Unigram 安装就得先装一堆依赖库
u823tg
2022-06-23 12:08:33 +08:00
貌似 wpf 现在正在进行 aot 改造着, 等一年多应该可以 aot 了
SMGdcAt4kPPQ
2022-06-23 12:42:06 +08:00
.NET 4.8 也可以部分支持 C# 11 ,修改 csproj 的 LangVersion 就行

dotnet CLI 也是可以用的
SMGdcAt4kPPQ
2022-06-23 13:04:11 +08:00
https://www.nuget.org/packages/Costura.Fody/
.NET 4.8 加上这个就可以打包成单 exe
wdwwtzy
2022-06-23 13:08:35 +08:00
还真不知道 msix 的情况,或许可以考虑不打包成 msix ,直接分发 zip 压缩包 🙂
VShawn
2022-06-23 14:09:29 +08:00
@u823tg #2 我的记忆里是说 WPF 不会支持 AOT ,MAUI 才会支持 AOT 。

@wdwwtzy #5 打包是为了发布在 Microsoft Store ,GitHub release 中是直接分发 zip 的。
u823tg
2022-06-23 14:31:25 +08:00
@VShawn #6 貌似在哪看过,winforms 有 aot 的基础了。 wpf 改造下也就有 aot 基础了。也可能我记错了。
INCerry
2022-06-23 15:09:45 +08:00
我不清楚打包应该怎么取消自带运行时,但是按照 publish 来说是可以选择是否包含运行时。楼主可以试一试看看。
<SelfContained>false</SelfContained>
https://docs.microsoft.com/zh-cn/dotnet/core/deploying/single-file/overview#publish-a-single-file-app---sample-project-file
lower
2022-06-23 15:57:47 +08:00
你这个集成的 ssh 工具是怎么弄的?可以大概说下思路么?
clijiac
2022-06-23 17:02:55 +08:00
这个工具不错啊, 收藏了
ysc3839
2022-06-23 18:03:26 +08:00
AppX/MSIX 可以手动打包吧?好像是新建个 AppX 项目,然后设置打包目录啥的,就能只打包自己要的文件了。
netnr
2022-06-23 19:27:51 +08:00
前面看到 github 讨论说 .NET Framework 因为系统内置,维护更新太麻烦了,开源版本不会系统内置了
VShawn
2022-06-24 08:17:47 +08:00
@u823tg #7 也可能是我记错,懒得查证了😅
@INCerry #8 谢谢,试了一下,打包体积没有变小
@ysc3839 #11 是的,这个是另一条路,我暂时还没尝试。
@lower #9 就...用主进程打开一个 KiTTY SSH 进程,然后用 Windows API 操作窗口位置使 SSH 窗口移动到主程序的 TAB Window 之中。
billzhuang
2022-06-24 08:20:19 +08:00
.net 4.8 到.net 6 可是翻天覆地的变化,羡慕楼主轻松升级。
hez2010
2022-08-13 01:33:53 +08:00
dotnet publish 的时候带一个 --no-self-contained 试试

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/861586

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX