使用Visual Studio Installer Projects 建立msi安裝程式

Visual Studio Installer Projects 是 Visual Studio 中的擴充元件,可以建立安裝程式,讓開發者能更容易將應用程式部屬到其他電腦上。
什麼是Visual Studio Installer Projects
Visual Studio Installer Projects 是 Visual Studio 的一個擴充功能,用來建立與管理msi安裝程式。開發者可以透過 Visual Studio Installer Projects 定義安裝程式的各種設定,包括安裝位置、啟動時的選項等。下面我們就來看看這個擴充元件的功能吧。
建立安裝程式前準備
下載並安裝 Visual Studio Installer Projects 擴充功能
1.首先點選Visual Studio工具列的延伸模組,接者點選管理延伸模組。

2.搜尋Visual Studio Installer Projects來安裝擴充元件。

3.安裝完擴充元件後重新啟動Visual Studio並建立新專案,搜尋Setup Project,如果有看到如圖的專案範本就代表擴充元件安裝成功了。

4.這裡使用MsiSetup為名稱建立Visual Studio Installer Projects的專案,畫面就是專案內容了,這裡可以進行msi安裝程式的設定,我們先建立msi安裝程式的內容。
準備安裝程式所需的資源文件
加入MsiApplication的WPF應用程式專案,裡面放一個Label而已。這個專案的輸出會包到msi安裝程式裡面。

封裝安裝資源
對MsiSetup的專案點選滑鼠右鍵,接者點View,再來點選檔案系統,畫面會出現檔案系統的內容。


左側選單是分別有三個資料夾
- 「Application Folder」是msi安裝程式的主要內容或其他自訂內容。
- 「User’s Desktop」會在桌面建立檔案,通常是放捷徑。
- 「User’s Programs Menu」則是開始功能表的內容。
設定msi安裝程式屬性
點選MsiSetup的專案,屬性視窗有很多參數可以設定,這裡列舉幾個常用的屬性。
| 屬性名稱 | 說明 |
| Author | 開發者名稱 |
| Description | 應用程式描述 |
| InstallAllUsers | 應用程式安裝完,可否讓電腦中的所有使用者可以使用 |
| PreBuildEvent, PostBuildEvent: | 在建置專案前、後的指令 |
| ManufacturerURL, SupportURL, UpdateURL | 製造商的網站、支援網址和更新網址 |
| ProductName | 應用程式的名稱,會顯示在安裝程式中 |

在MsiSetup的專案按下滑鼠右鍵點選屬性,接者點選Prerequistites…可以在安裝程式進行時安裝條件元件,如果目標作業系統沒有安裝的話會順便安裝。


設定「Application Folder」內容
1.在「Application Folder」按下滑鼠右鍵,點選Add,接者點選專案輸出。

2.視窗選擇要輸出的專案,我們選擇剛才建立的MsiApplication的WPF專案。接者選擇發布項目,再按下確定,這個時候Application Folder資料夾底下就會有剛選擇的專案輸出的內容。


3.在專案屬性的DefaultLocation選項設定msi預設的安裝位置。

預設安裝位置會放在C:\Program Files\…,要注意這個資料夾有系統管理員權限的問題,如果程式有寫log之類要產生檔案沒有權限會有Exception。
設定「User’s Desktop」內容
1.點選「User’s Desktop」,在右方資源內容的空白處按滑鼠右鍵,點選建立新捷徑。

2.接者點選Application Folder,然後點選發布項目,然後點選OK。

3.這個時候資源內容就會多一個用來執行程式的捷徑,可以將它重新命名,也就是到時候桌面會出現的捷徑名稱。

4.在屬性視窗中的Icon屬性可以選擇桌面捷徑的icon(可將ico檔案放在Application Folder資料夾裡面,再從該資料夾選取)。

設定「User’s Programs Menu」內容
這裡是放開始功能的內容,這邊範例就不放東西了。

建立msi安裝檔
在MsiSetup安裝程式的專案點選滑鼠右鍵,點選建置,建置完之後就可以在Debug資料夾產生msi安裝程式了。


測試安裝檔
執行剛剛編譯完的MsiSetup.msi之後就會顯示以下安裝程式,請依照指示安裝,安裝完成後,桌面就會有捷徑,點開就可以直接執行程式剛剛在MsiApplication建立的WPF專案的程式瞜。


常見問題
如何在msi安裝程式內的exe執行檔建立數位簽章?
1.可以利用PostBuildEvent的屬性在建立msi以前先執行數位簽章的動作。對MsiSetup的專案點選滑鼠右鍵,依序點選View→檔案系統→Application Folder→發布項目。

2.在專案屬性中,點選Outputs屬性旁邊的「…」點一下,會出現視窗,這個視窗是用來看msi的資源內容及來源位置,會發現msi在建立前會把資源放在obj資料夾。apphost.exe就是要簽署的目標檔案。


3.簽署的流程可以參考如何產生測試憑證並利用SignTool工具進行程式碼簽章(Code Signing),把要簽屬的exe改成Outputs的apphost.exe位置,並將指令貼到PreBuildEvent即可。
PreBuildEvent也可以做在建立msi以前的事件,可以依照需求調整。

如何使用「獨立式」部屬方式建立msi
msi在建立時專案的部屬模式會預設使用「Framework相依性」來建置專案,例如我是利用.net 8.0來寫專案的,如果當目標電腦沒有安裝.net 8.0的元件時,執行程式會提示需要安裝目標元件。

如果不想要跳出安裝元件的提示視窗有兩種方法,
第一個方法是透過msi專案的Prerequistites來設定要安裝的元件。
第二個方法是利用「獨立式」的方式進行編譯並建立msi安裝程式,這樣使用者就不需要另外安裝目標元件,相對的msi的檔案也會比「Framework相依性」還要大。
這邊我們示範使用「獨立式」的方式來編譯。
1.在MsiApplication的專案點滑鼠右鍵,點選發布

2.點選新增發行設定檔。

3.點選資料夾→資料夾。

4.點選完成,就會產生發行檔,上面有發行檔的位置,等等要用這個發行檔來編譯產生msi。

5.接者在發行設定檔的目標執行階段點選設定,在部屬模式設定成獨立式。目標執行階段可以依照需求調整。

6.點選msi安裝程式專案裡MsiApplication的發布項目,在屬性視窗中的PublishProfilePath署性,把剛剛發行設定檔的目錄填上去,再進行編譯即可(如果編譯不過,可以先編譯MsiApplication的專案試試)。

7.編譯完之後,利用這個安裝程式安裝,使用者不需另外安裝的.net8.0元件就可以執行程式。

結語
總結來說,Visual Studio Installer Projects對於希望簡化和自動化應用程式部署過程的開發者來說是一個非常實用的擴充元件,它不僅提供了強大的功能,還提供了直觀的使用界面,確保應用程式能夠順利的部屬到其他電腦上。



