Windows 應用發布方式怎麼選 - MSI / MSIX / ClickOnce / xcopy / 自訂 updater 的判斷表
· 小村 豪 · Windows, 發布, MSI, MSIX, ClickOnce, xcopy, updater
選 Windows 應用的發布方式時,話題常常從「哪一個比較新」「哪一個比較簡單」開始。
但真正在實務上起作用的,是另一套軸線。
- 想以使用者為單位安裝,還是以整台機器為單位安裝
- 更新要不要交給發布平台,還是自己掌握
- 是否涉及服務/驅動/shell extension/COM 註冊這類 OS 整合
- 是否需要撐得住封閉網路/離線/USB 發布
- 要不要 package identity,或想以純 Win32 不受限(unrestricted)的方式跑
發布方式的選擇,不是 installer 格式的偏好,而是 要動到 OS 多深 與 更新責任由誰扛 的選擇。
1. 先下結論
用比較粗、但實務好用的說法:
- 要裝到整台機器、有服務或 COM 註冊、有前置相依要裝:從 MSI 起算
- 以 Windows 10/11 為前提、需要 clean install / clean uninstall、更新頻繁、想要 package identity:MSIX 有力
- 想把 .NET 公司內部桌面應用以使用者單位輕鬆派發並自動更新:ClickOnce 至今仍相當強
- 優先「放著就能跑的工具、封閉網路、USB 發布、不需系統管理員權限」:xcopy 最直接
- 想自己掌握更新 UX、頻道、分段發布、telemetry、復原策略:自訂 updater
- 需要驅動:一開始不要以 MSIX 為中心比較安全
- 需要 Explorer 的 in-process shell extension:MSIX 不適合
總之,大致如下:
- 向 OS 註冊很濃 → 偏向 MSI
- 想拿到 package identity 與 modern packaging → MSIX
- 想要 per-user 的簡易發布與內建更新 → ClickOnce
- 「放著就能跑」是第一優先 → xcopy
- 有決心自己設計並營運更新平台 → 自訂 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 個問題
- 這個應用 current user 就夠,還是要 machine-wide 安裝
- 有沒有 service/driver/shell extension/COM 註冊
- 是否會用到需要 package identity 的 Windows 功能
- 是否只以標準使用者權限導入
- 更新頻率是每月、每週,還是更高
- 目標環境是不是封閉網路、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. 參考資料
- Microsoft Learn, Windows Installer
- Microsoft Learn, What is MSIX?
- Microsoft Learn, Packaging overview for Windows apps
- Microsoft Learn, MSIX features and supported platforms
- Microsoft Learn, App Installer file overview
- Microsoft Learn, Prepare to package a desktop application
- Microsoft Learn, Know your installer
- Microsoft Learn, Convert an installer that includes services
- Microsoft Learn, ClickOnce deployment and security
- Microsoft Learn, Manage updates for a ClickOnce application
- Microsoft Learn, Choosing a ClickOnce deployment strategy
- Microsoft Learn, ClickOnce cache overview
- Microsoft Learn, Windows App SDK deployment guide for self-contained apps
相關文章
共用相同標籤的最新文章。能以相近的主題延伸理解。
自動更新功能的安全性基本 - 糟糕的模式與最佳實踐
把自動更新當成信任的發佈而非檔案傳輸來重新整理,從只靠 HTTPS 不夠的理由、signed metadata 與用戶端驗證、簽章金鑰的運營分離、staging 與 fail-closed、rollback 與 freeze 的對策,到 Windows 上 MSIX 與 C...
ClickOnce 是什麼 - 以實務視角整理機制、更新、適合場面・不適合場面
本文以實務視角整理 ClickOnce 是什麼,從 manifest、快取、更新、簽章的構造,到適合公司內部 .NET 桌面業務應用程式的案件與不適合 machine-wide 或 service、driver 等深度 OS 整合的案件,幫助讀者判斷是否採用並掌握 depl...
Windows 什麼時候需要系統管理員權限 - UAC、保護區、設計上的分辨方式
從邊界與儲存位置的角度,整理 Windows 何時真正需要系統管理員權限:UAC、保護區、HKLM、服務、驅動、防火牆。同時說明 per-user 與 per-machine 的差異,以及把管理員處理切成獨立 EXE、服務或工作的設計取捨,幫讀者判斷該不該提權。
整理 Windows 的字元編碼與換行符 - Shift_JIS / UTF-8 / UTF-16、亂碼、CRLF / LF,為何混亂
本文整理 Windows 上字元編碼與換行符容易混亂的核心:bytes、UTF-8 與 CP932、UTF-16LE、BOM、CRLF 與 LF 是不同軸的概念,亂碼源於以錯誤前提 decode,且誤儲存後無法還原。讀完即可在規格中寫出明確的 encoding 與換行約定,...
用 Windows 沙箱加速 Windows 應用程式開發的驗證 - 以實務向整理管理員權限問題、乾淨環境、權限不足・資源不足的重現
整理在 Windows 應用程式開發中如何運用 Windows Sandbox 加速驗證的實務做法。透過按情境分檔的 .wsb、唯讀輸入與專用 Outbox 寫入分離、在容器內另建標準使用者重現權限不足、以及降低記憶體和關閉 vGPU 製造資源不足偏向,把每次的乾淨環境準備...
相關主題
與本文相近的主題頁面。以本文為起點,可進一步連到相關服務與其他文章。
Windows 技術主題
彙整 KomuraSoft LLC 關於 Windows 開發、故障調查與既有資產活用文章的主題中心。
與本主題相關的服務
本文連結到以下服務頁面,歡迎從最接近的入口查看。
Windows 應用程式開發
支援包含常駐處理、設備連動、運作日誌與可維護結構的 Windows 桌面應用程式。
Windows 軟體維護 & 現代化
支援既有 Windows 軟體的階段性升級、功能追加、64 位元就緒以及可維護性的重構。
作者檔案
本文作者的個人檔案頁面。
Go Komura
小村軟體有限公司 代表
以 Windows 軟體開發、技術諮詢與故障調查為中心,在難以重現的故障調查與既有資產仍在運作的專案上具有優勢。