最近使用Visual Studio 2010,嘗試把服務包裝成安裝檔時吃了一點苦頭
為了避免未來再次犯錯,因此記錄一下要注意的地方
希望能幫助有遇到相同情形的網友

(為什麼用VS2010示範,是因為這個安裝工具在VS2012以後就被拿掉了
最近已經有解,請參考本篇最後一節)

如何撰寫服務網路上已有很多教學資料了
(打開專案選擇Windows服務,然後在Service1.cs寫code即可)
在此就不贅述,直接說明要如何把他打包成安裝檔

 

1. Service1.cs點右鍵,選擇「加入安裝程式

install_1

專案會多出ProjectInstaller.cs這個檔案
包含了serviceProcessInstaller1serviceInstaller1這兩個項目

install_16 

serviceProcessInstaller1通常會修改的只有Account這個屬性
關係到該服務使用的帳戶類型,預設User時在安裝會要求輸入登入的帳密
如果是LocalSystem類型就會要求Administrator權限

install_2

serviceInstaller1需要修改服務的名稱、描述等
ServiceName - 服務名稱
DisplayName - 顯示名稱
Description - 描述
StartType - 服務的啟動類型,分為自動、手動、停用
如果是常駐型的服務,請選擇Automatic
DelayedAutoStart - 延遲開始,一般選False

 

2. 方案中加入安裝專案

install_3

選擇[Visual Studio Installer]-[安裝專案]

 

3. 指定安裝專案要複製的檔案

install_4

右鍵選[加入]-[專案輸出]

install_5

選擇指定的專案,然後選[主要輸出]
他會將該專案編譯過的檔案都包含進來(包括必要的dll)
可以在主要輸出的Outputs屬性觀看會輸出的檔案

 

4. 加入專案額外的檔案

某些專案可能需要額外的資料檔
這些檔案也要在編譯時輸出到目錄

install_6

加入方式跟前面相同,[加入]-[專案輸出],選擇[內容檔]

不過當你檢查輸出後會發現,有些檔案竟沒有被加入,這是怎麼回事呢?
我檢查了一陣子才知道,原來需要設定資料檔的屬性
建置動作需設定為[內容]才會加入

install_7

順便一提,如果這些資料檔要跟執行檔放在同個目錄的話
複製到輸出目錄這一項請把[不要複製]改成別的選項

install_8

 

5. 設定安裝程式屬性

install_13

以下只舉部分重要例子
Product Name - 軟體名稱,會顯示在安裝畫面上
Manufacturer - 製造商名稱,注意這個項目會變成預設安裝的路徑
InstallAllUsers - 預設安裝給所有使用者,安裝時可修改
RemovePreviousVersions - 重新安裝時是否要先把舊版本移除
Title - Metadata的標題,注意不會顯示在安裝程式中
Author - Metadata的作者
TargetPlatform - 安裝平台,會影響預設安裝路徑

預設安裝目錄為C:\Program Files (x86)\(Manufacturer)\(ProduectName)
其中TargetPlatform若為x86會裝在Program Files (x86),反之是Program Files

 

6. 加入自訂動作,讓服務自動安裝
如果只修改了以上參數就直接安裝
應該會發現雖然安裝成功了,但是服務卻沒有裝進系統
這是因為我們目前的操作僅是把專案輸出檔案給複製過去,沒有設定安裝服務
所以我們需要加入自訂動作,安裝檔就會自動安裝/解除安裝服務了

install_9

安裝專案按右鍵,選[檢視]-[自訂動作]

install_10

出現畫面後,在自訂動作按右鍵選[加入自訂動作]

install_11

跳出詢問視窗後,雙擊[應用程式資料夾],再選[主要輸出]

install_12

 

7. 安裝

install_17

請先建置,注意不可選功能表的建置方案
原因是安裝專案一般不會自動加入建置專案

install_14

建置成功後,安裝專案按右鍵,選擇[安裝]即可

 

8. 安裝完後,服務沒有啟動?
這是正常的
不知道為什麼沒有安裝完後自動啟動服務的選項
但沒關係,如果真的想要自動啟動,可以靠額外code達成

install_15

在ProjectInstaller.cs修改程式碼如下(紅字為新增部分)

public ProjectInstaller()
{
    InitializeComponent();

    this.AfterInstall += new InstallEventHandler(ProjectInstaller_AfterInstall);
}

private void ProjectInstaller_AfterInstall(object sender, InstallEventArgs e)
{
    System.ServiceProcess.ServiceController sc = new System.ServiceProcess.ServiceController(serviceInstaller1.ServiceName);
    if (sc != null)
        sc.Start();
}

 

9. 服務一啟動就出現錯誤訊息
"在本機電腦的Service1服務已啟動又停止,有些服務如果並未由其他服務或程式使用,會自動停止"
這句話的意思代表這個服務一開始就出現Exception,所以在剛啟動就停止了
那要怎麼Debug呢? 可以去[控制台]-[系統管理工具]-[事件檢視器]找尋錯誤原因
在系統管理事件就會顯示Service出錯的錯誤訊息了

 

10. 有沒有辦法Debug服務?
其實這個問題跟安裝沒什麼關係,不過既然都提到服務了,就一起說明

install_18

Visual Studio可以選擇功能表的[偵錯]-[附加至處理序]

install_19

然後找到該服務並附加即可
要怎麼找呢?可以直接至[工作管理員]-[服務]看自己服務的PID
如果該服務是以SYSTEM方式登入的,請勾選[顯示所有使用者的處理序]才能看到

當附加後,就可以對程式下中斷點等處理了

 

11. Visual Studio 2012以後的版本能不能用這個工具?
不知為何,Visual Studio 2012以後這工具就被拿掉了,令人惋惜
(只剩下商業軟體InstallShield連結)

好消息是微軟最近為Visual Studio 2013開發出一款擴充套件
Microsoft Visual Studio Installer Projects
裝了之後,Visual Studio 2013就可以開啟過去無法開啟的vdproj檔了
(注意:僅支援VS2013,VS2012還是沒辦法 強迫大家升級
可惜沒有支援多國語言,介面僅有英文版

arrow
arrow
    全站熱搜

    蕭雲 發表在 痞客邦 留言(4) 人氣()