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

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

  •  1
     
  •   VShawn · 6 天前 · 1717 次点击

    最近把开源项目重构并从 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

    14 条回复    2022-06-24 08:20:19 +08:00
    codehz
        1
    codehz  
       6 天前
    UWP 当然也是可以有外部依赖的(隔壁 Unigram 安装就得先装一堆依赖库
    u823tg
        2
    u823tg  
       6 天前
    貌似 wpf 现在正在进行 aot 改造着, 等一年多应该可以 aot 了
    ComputerIdiot
        3
    ComputerIdiot  
       6 天前
    .NET 4.8 也可以部分支持 C# 11 ,修改 csproj 的 LangVersion 就行

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

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