跳過到頁腳內容
Iron Academy Logo
學習 C#
學習 C#

其他分類

如何發布和部署 .NET WPF 工具

Tim Corey
10m 40s

建置一個小型桌面實用工具只是完成了一半的工作。 將它安裝到您的機器上,將它放置在您可以快速啟動的地方,並保持部署足夠輕量,這樣您就再也不用考慮它,這是另一半的工作。 太多開發者在這一步過度設計,為只需在一個工作站上運行的應用程式引入了安裝框架或跨平台工具。

在他的影片《如何發布和部署 .NET WPF 實用工具》中,Tim Corey 演示了他如何將他的個人圖像檢視器應用程式發佈為單一執行檔,將其複製到一個資料夾中,並通過註冊表將其接入 Windows 的右鍵單選單。 我們將介紹他在此過程中所做的每個決策,從依賴框架與自包含構建到使工具在任何資料夾中都可訪問的註冊表項。 如果您為自己建置了一個小工具,並希望獲得最簡單的部署方案,本文提供了這種方法。

從 Visual Studio 發布

[1:03 - 1:25] Tim 首先右鍵單擊 Visual Studio 中的專案並選擇發布。 精靈提供了幾個目標(Azure、Docker、ClickOnce),但他跳過了所有這些,而選擇了資料夾。 對於位於您自己的機器上的個人工具,發佈到資料夾是最直接的途徑:它生產的文件可以在任何需要的地方複製,無需任何部署基礎設施。

選擇資料夾目標後,Tim 直接進入設定頁面,而不是立即執行發布。 在輸出符合他的要求之前需要調整默認值。

依賴於框架與自包含

[1:25 - 2:32] 第一個設置是部署模式。 依賴於框架的構建假設 .NET SDK 或運行時已經安裝在目標機器上。 數據量小,這個應用程式大約200千字節,因為它依賴於您系統上現有的共享運行時。

自包含構建將整個 .NET 運行時打包到輸出中。 這使得該包能夠在沒有安裝 .NET 的機器上運行,但會增加其大小至大約 140 MB。 Tim 選擇依賴於框架,因為他所使用的每台機器都已經安裝了 .NET。 如果您要將工具分發給可能沒有運行時的同事或客戶,自包含是更安全的選擇,但對於個人工具來說,這種權衡幾乎沒有意義。

為什麼選 WPF 而不是 MAUI

[2:50 - 4:10] Tim 回應了他接受過的有關此專案使用 WPF 而非 MAUI 的回饋意見。 他的理由是實際而非意識形態。 圖像檢視器只需要在 Windows 上運行。 引入 MAUI 及其跨平台層增加了開銷,而對於單一平台工具來說則沒有任何好處。

除了建築設計上的論點,還存在一個維護角度。 Tim 的原始源代碼在大約七年中已在四到五台機器上生存,變化很小。 唯一的更新是框架升級(從 .NET Framework 到 .NET 8,現在到 .NET 10)。 如果該工具一直基於一個在 Apple 或 Google 每次發布操作系統更新時都需要關注的框架,這七年的免維護運行就不可能實現。 一個用於維護時間超過節省時間的工具已不再節省您的任何東西。

單一文件發布和 PDB 文件

[4:59 - 6:32] 確定部署模式後,Tim 啟用了"生成單一文件"並以 Windows x64 為目標。發布完成並打開輸出文件夾,其中包含兩個文件:.pdb

第二個文件是程序數據庫文件,其作用值得理解。 當您在發布模式下編譯時,編譯器會優化並重命名內部符號以提高性能。 PDB 會將這些優化的名稱映射回您的實際代碼庫,讓您能夠將調試器附加到運行中的執行文件並設置斷點,就像您在 Debug 模式中工作一樣。 對於服務客戶的生產應用程式,您應將 PDB 文件與每次發布一起安全地存儲,以便在部署後診斷問題。

對於您自己構建的工具,Tim 指出 PDB 對於應用程式的運行非必需。 為了簡化,他將其刪除,但告誡觀眾不要養成這種習慣,特別是對於發給用戶的任何東西。 沒有 PDB 存在,單一 .exe 可以獨立運行。

有一個值得注意的小問題:如果您從依賴於框架切換到自包含並保持"單一文件"啟用,輸出不再是單一文件。 附加的運行時文件將與執行檔一起出現。 只有在與依賴於框架的構建配對時,單一文件選項才會生成真正的單一文件。

在您的機器上放置工具

[7:17 - 7:52] 獲得執行文件後,Tim 將其移至一個永久位置。 他使用了一個專用的C:\Apps\SimpleImageViewer資料夾,這一約定將個人工具與程式檔案分開,且易於定位。 2024 年的執行檔依然可以在他目前的機器上相同運行,這再次證實了關於可持續性的觀點:一個範圍明確的工具配有一個 簡單的專案結構可以在硬件變化和操作系統升級中不做修改地生存。

將工具添加到右鍵選單

[7:52 - 10:21] 最後一步將工具接入 Windows Explorer 的上下文菜單。 Tim 修改 Windows 註冊表在两个位置下增添条目:一個是在文件夾上右鍵單擊,以打開一個圖像目錄;另一個是在文件夾內的空白處右鍵單擊,以在當前目錄下啟動檢視器。

每個註冊表項都創建一個 shell 命令,該命令將所選路徑作為命令行參數傳遞給可執行文件。 這是應用程式入口點中的 args 參數所得值的來源。

Tim 提供了一個 .reg 文件,但在分享之前將其重命名為 .txt。 這種預防措施很重要:雙擊.reg文件立即提示將值寫入註冊表,且運行不受信任的註冊文件可能會導致嚴重的系統問題。 他的方法要求您打開文件、驗證路徑、將它們更新為符合您的機器、將擴展名改回.reg,並且僅在此之後執行。 如果這一過程中的任何一部分讓您感到陌生,Tim 給出的建議很簡單:不要修改註冊表。

對於熟悉註冊表的開發者來說,這兩個條目是直接的。 每個人都創造了一個命名的 shell 命令在適當的鍵下,指向您的可執行文件的全部路徑,帶有%1占位符,在運行時傳遞目标目錄或文件路徑。 可能需要重啟才能顯示新上下文菜單條目。

結束:部署一次,永遠使用

[10:21 - 10:30] 整個部署過程只有兩步:發佈到資料夾,然後在右鍵單選單裡註冊可執行文件。 沒有安裝程式,沒有更新機制,沒有雲服務。對於自己的機器上的單一用途工具,這種簡單是重點。

結論

[10:30 - 10:40] 總結一下:dotnet publish 使用依賴於框架和單一文件設置,不會讓您考慮到部署基礎設施,在任何地方執行。 一堆註冊表條目將其變成 Windows Explorer 中的上下文菜單操作。

貫穿整個視頻的教訓是克制。 將您的部署方法與應用程式的範圍相匹配。 為個人使用而構建的工具不需要像為數以千計的客户推出的產品那樣的基礎結構,而這樣處理只會創造出維護工作,從而侵蝕掉工具本身應節省的時間。

提示範例:即使是個人專案,也要保留您的 PDB 文件。 將其存放在與可執行文件相同的文件夾或附近的存檔中。如果幾個月後該工具表現不如預期,擁有 PDB 可以讓您在不重新編譯源代碼的情況下附加 Visual Studio 並調試發佈版本。

觀看完整影片於他的YouTube頻道,獲得有關部署 .NET 桌面應用程式的更多見解。

Hero Worlddot related to 如何發布和部署 .NET WPF 工具
Hero Affiliate related to 如何發布和部署 .NET WPF 工具

通過分享您所愛的東西賺得更多

您是否在為使用.NET、C#、Java、Python或Node.js的開發者創建內容?將您的專業知識轉化為額外收入!

鋼鐵支援團隊

我們每週 5 天,每天 24 小時在線上。
聊天
電子郵件
打電話給我