V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
VShawn
V2EX  ›  Windows

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

  •  1
     
  •   VShawn · 2022-06-23 11:17:36 +08:00 · 3609 次点击
    这是一个创建于 902 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    EXE 发布

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

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

    image

    MSIX 发布

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

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

    image

    我推测 .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

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

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

    @wdwwtzy #5 打包是为了发布在 Microsoft Store ,GitHub release 中是直接分发 zip 的。
    u823tg
        7
    u823tg  
       2022-06-23 14:31:25 +08:00
    @VShawn #6 貌似在哪看过,winforms 有 aot 的基础了。 wpf 改造下也就有 aot 基础了。也可能我记错了。
    INCerry
        8
    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
        9
    lower  
       2022-06-23 15:57:47 +08:00
    你这个集成的 ssh 工具是怎么弄的?可以大概说下思路么?
    clijiac
        10
    clijiac  
       2022-06-23 17:02:55 +08:00
    这个工具不错啊, 收藏了
    ysc3839
        11
    ysc3839  
       2022-06-23 18:03:26 +08:00
    AppX/MSIX 可以手动打包吧?好像是新建个 AppX 项目,然后设置打包目录啥的,就能只打包自己要的文件了。
    netnr
        12
    netnr  
       2022-06-23 19:27:51 +08:00 via Android
    前面看到 github 讨论说 .NET Framework 因为系统内置,维护更新太麻烦了,开源版本不会系统内置了
    VShawn
        13
    VShawn  
    OP
       2022-06-24 08:17:47 +08:00
    @u823tg #7 也可能是我记错,懒得查证了😅
    @INCerry #8 谢谢,试了一下,打包体积没有变小
    @ysc3839 #11 是的,这个是另一条路,我暂时还没尝试。
    @lower #9 就...用主进程打开一个 KiTTY SSH 进程,然后用 Windows API 操作窗口位置使 SSH 窗口移动到主程序的 TAB Window 之中。
    billzhuang
        14
    billzhuang  
       2022-06-24 08:20:19 +08:00 via iPhone
    .net 4.8 到.net 6 可是翻天覆地的变化,羡慕楼主轻松升级。
    hez2010
        15
    hez2010  
       2022-08-13 01:33:53 +08:00 via iPad   ❤️ 1
    dotnet publish 的时候带一个 --no-self-contained 试试
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5348 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 02:54 · PVG 10:54 · LAX 18:54 · JFK 21:54
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.