Windows 應用發布方式怎麼選 - MSI / MSIX / ClickOnce / xcopy / 自訂 updater 的判斷表

· · Windows, 發布, MSI, MSIX, ClickOnce, xcopy, updater

下載日英雙語 Excel 判斷表

選 Windows 應用的發布方式時,話題常常從「哪一個比較新」「哪一個比較簡單」開始。
但真正在實務上起作用的,是另一套軸線。

  • 想以使用者為單位安裝,還是以整台機器為單位安裝
  • 更新要不要交給發布平台,還是自己掌握
  • 是否涉及服務/驅動/shell extension/COM 註冊這類 OS 整合
  • 是否需要撐得住封閉網路/離線/USB 發布
  • 要不要 package identity,或想以純 Win32 不受限(unrestricted)的方式跑

發布方式的選擇,不是 installer 格式的偏好,而是 要動到 OS 多深更新責任由誰扛 的選擇。

1. 先下結論

用比較粗、但實務好用的說法:

  • 要裝到整台機器、有服務或 COM 註冊、有前置相依要裝:從 MSI 起算
  • 以 Windows 10/11 為前提、需要 clean install / clean uninstall、更新頻繁、想要 package identityMSIX 有力
  • 想把 .NET 公司內部桌面應用以使用者單位輕鬆派發並自動更新ClickOnce 至今仍相當強
  • 優先「放著就能跑的工具、封閉網路、USB 發布、不需系統管理員權限」xcopy 最直接
  • 想自己掌握更新 UX、頻道、分段發布、telemetry、復原策略自訂 updater
  • 需要驅動:一開始不要以 MSIX 為中心比較安全
  • 需要 Explorer 的 in-process shell extension:MSIX 不適合

總之,大致如下:

  1. 向 OS 註冊很濃 → 偏向 MSI
  2. 想拿到 package identity 與 modern packaging → MSIX
  3. 想要 per-user 的簡易發布與內建更新 → ClickOnce
  4. 「放著就能跑」是第一優先 → xcopy
  5. 有決心自己設計並營運更新平台 → 自訂 updater

2. 這 5 個不在同一個擂台上

這點很重要。

MSI / MSIX / ClickOnce / xcopy 主要談的是 怎麼裝
自訂 updater 主要談的是 更新責任由誰扛

所以實務上把這件事拆成兩層會比較好整理。

主要候選 要決定什麼
初次導入 MSI / MSIX / ClickOnce / xcopy 放到哪、要註冊什麼、權限、解除安裝
持續更新 MSIX App Installer / ClickOnce / 手動替換 / 自訂 updater 更新確認、發布來源、簽章驗證、rollback、頻道、UI

所以 自訂 updater 不是第一個選項,而是現有發布方式滿足不了更新需求時再追加的選項,這樣比較穩。

3. 一張判斷表

先放最實用的判斷表。

情境 優先選 理由
全使用者導入,有服務、COM 註冊、machine-wide 設定 MSI 上 Windows Installer 的擂台比較少出事
以 Windows 10/11 為前提,要 clean install / uninstall、更新頻繁、要 package identity MSIX 容易靠進 modern packaging 與 update 模型
想把 .NET 公司內部業務應用以 per-user 輕鬆派發 ClickOnce 內建的更新模型好用
放著就能跑的工具、封閉網路、USB、不需系統管理員 xcopy 盡量不引入 install 的觀念
商用產品,想自己掌握更新 UX 與頻道 自訂 updater 比內建更新自由度高
需要驅動 偏 MSI 或專用 installer driver package 另一回事,MSIX 不合適
需要 in-process shell extension 偏 MSI 或專用 installer shell extension 與 MSIX 相性不佳

這張表最重要的一點是:「有更新需求」這一條單獨不足以跳到自訂 updater

4. 觀點別比較

觀點 MSI MSIX ClickOnce xcopy 自訂 updater
per-user 導入容易度
per-machine 導入容易度 ×
內建更新 ×
package identity × × × ×
與服務的相性 × ×
與驅動的相性 × × ×
與 shell extension 的相性 × × ×
封閉網路/離線發布
實作/營運成本 ×
更新 UX 自由度 ×

看這張表時要問的不是 哪個最強,而是 哪個摩擦最少

5. 各自適合什麼樣的案子

5.1 MSI

MSI 是 要把 Windows 傳統桌面應用端端正正地做 install / uninstall / repair 時的基準點。

特別適合:

  • 全使用者導入的業務應用
  • 含 Windows 服務的應用
  • 涉及 COM 註冊、file association、machine-wide 設定的應用
  • 已有 installer 營運經驗的產品

MSI 的強項在於 能用 Windows 的慣例表達「這個應用怎麼裝到 OS」

弱點也清楚:

  • authoring 其實不好寫
  • upgrade/patch 設計粗糙就後患無窮
  • custom action 越多越容易壞
  • 對高頻更新的產品,更新 UX 容易偏重

5.2 MSIX

MSIX 是 想取得 modern packaging 與 clean update/uninstall 的選擇。想用到需要 package identity 的 Windows 功能時,意義更大。

特別適合:

  • 可以以 Windows 10/11 為前提的桌面應用
  • 更新頻率偏高的業務應用
  • 想用到 package identity 相關 Windows 功能的應用
  • 偏向 Intune 或 App Installer 的案子

MSIX 的強項在於 更新與解除安裝的乾淨

但不是什麼都能裝,下面這些要先確認:

  • in-process shell extension
  • driver
  • 需要 unrestricted 的舊式 Win32 前提
  • 不想背負 package identity 的結構

5.3 ClickOnce

ClickOnce 在 想以 per-user、快速、含更新的方式派發 .NET 公司內部桌面應用 上至今仍相當強。

適合:

  • 公司內部業務應用
  • 以標準使用者權限導入
  • 以使用者為單位派發就足夠
  • 更新 UX 不需要做得很精緻

相對地,若產品需要深入 OS,或期待 installer 來綁多個前置相依,就不適合。

5.4 xcopy

xcopy 是 deploy 而不是 install。沒有登錄註冊、沒有修復功能、沒有 package identity。但若「放著就能跑」,它幾乎是最簡單的。

特別適合:

  • 診斷工具
  • 設備設定工具
  • 日誌收集工具
  • 以 USB 送到現場的小工具
  • 想讓多版本 side-by-side 共存的情境

xcopy 的強項是 失敗模式清楚。整個資料夾替換,要退回就退回舊版本,營運上很好管理。

當然下面這些會弱:

  • Start menu/ARP/repair
  • file association/service/shell extension/driver
  • 內建更新

5.5 自訂 updater

自訂 updater 比起 選擇自由度,更像是 選擇責任

適合:

  • 更新頻率高
  • 想要 stable/beta/preview 等頻道
  • 想控制分段發布或 rollout 百分比
  • 想精細控制背景下載、通知、維護時段
  • 想自己掌握更新 telemetry 或 crash recovery

強項大,但要付的代價也大:

  • 簽章驗證
  • 發布 manifest
  • retry/resume
  • proxy/firewall/封閉網路對應
  • rollback
  • 壞掉的更新的復原
  • updater 本身的更新

也就是 不是自由度變大,而是責任變重

6. 容易糾結的幾個重點

6.1 是否需要 package identity

若你要用的是以 package identity 為前提的 Windows 功能,MSIX 的價值就一口氣上來。

反之:

  • 想要不受限的 file system access
  • 想要不受限的 registry access
  • 想保留 elevation/process model 的自由
  • 想留住原本的舊式 Win32 假設

這種情況下偏 unpackaged 的方式才自然。

6.2 是否涉及服務/驅動/shell extension

這三個會大幅拉高發布方式的複雜度。

  • driver:MSIX 不合
  • in-process shell extension:MSIX 不合
  • Windows 服務:MSI 很自然;MSIX 有條件納入比較

與 OS 深度耦合的要素越多,主題越不是「外觀簡單的發布」,而是 能否正確地導入、更新、移除

6.3 per-user 還是 per-machine

這一點模糊往前推,之後一定會吵:

  • 偏 per-user
    • ClickOnce
    • xcopy
    • 部分的 MSIX
  • 偏 per-machine
    • MSI
    • 條件合的話 MSIX

「想不需要系統管理員權限安裝」和「全使用者都從同一個位置使用」不是同一件事。

6.4 更新頻率與營運責任

依更新頻率的感覺大致是:

  • 每季到每月更新:MSI 就足以應付
  • 每月到每週更新:MSIX/ClickOnce 會輕鬆許多
  • 每週到每日更新:自訂 updater 開始有檢討的理由
  • 手動更新即可/由部署端控制:xcopy 也行

發布方式既是 技術選型,也是 營運設計

6.5 封閉網路/離線發布

在封閉網路裡,簡單 常常勝過漂亮的自動更新:

  • xcopy 很強
  • MSI 也很強
  • ClickOnce 可以走 file share 或 removable media
  • MSIX 只要 App Installer 用法對,也能跑

但在封閉網路裡要頻繁更新,就得決定「誰、把新版放到哪、舊版怎麼處理」,光選方式不決定營運,很快就會壞掉。

7. 猶豫時最後看的 6 個問題

  1. 這個應用 current user 就夠,還是要 machine-wide 安裝
  2. 有沒有 service/driver/shell extension/COM 註冊
  3. 是否會用到需要 package identity 的 Windows 功能
  4. 是否只以標準使用者權限導入
  5. 更新頻率是每月、每週,還是更高
  6. 目標環境是不是封閉網路、OS 版本是否齊一

這 6 題回答完,大致會落到:

  • 2 為「是」 → 先從 MSI 側看
  • 3 為「是」 → 優先看 MSIX
  • 1 是 current user,4 為「是」,且是 .NET desktop app → ClickOnce 很有力
  • 4 為「是」,2 為「否」,且營運允許放著就好 → xcopy 很有力
  • 5 很高,且把更新 UX 視為產品價值 → 把自訂 updater 納入比較

8. 總結

Windows 應用發布方式大致可以收斂成一句話:

初次導入怎麼成立,和
持續更新由誰扛,這兩件事要分開決定。

在此之上,粗略的實務判斷是:

  • MSI:深入 OS 的傳統 desktop app
  • MSIX:想拿 package identity 與 modern packaging/update 的 app
  • ClickOnce:per-user 的 .NET 業務應用,想輕鬆派發與更新
  • xcopy:放著就好、自成一體的工具
  • 自訂 updater:有覺悟要自己設計並營運更新這件事的產品

最重要的是:

  • driver/shell extension/service 時,發布方式的選擇不是最後的外觀,而是從 OS 整合方式決定
  • 需要 package identity 時,MSIX 的意義就大
  • 自訂 updater 是壓箱底的選項,不是第一選項
  • 封閉網路,簡單往往比聰明更重要

若還在猶豫,先把 per-user 或 per-machine要向 OS 註冊什麼更新頻率多高 這三件事固定下來,討論就能明顯往前推進。

9. 參考資料

共用相同標籤的最新文章。能以相近的主題延伸理解。

與本文相近的主題頁面。以本文為起點,可進一步連到相關服務與其他文章。

本文連結到以下服務頁面,歡迎從最接近的入口查看。

作者檔案

本文作者的個人檔案頁面。

Go Komura

小村軟體有限公司 代表

以 Windows 軟體開發、技術諮詢與故障調查為中心,在難以重現的故障調查與既有資產仍在運作的專案上具有優勢。

回到部落格一覽