最近使用Visual Studio 2010,嘗試把服務包裝成安裝檔時吃了一點苦頭
為了避免未來再次犯錯,因此記錄一下要注意的地方
希望能幫助有遇到相同情形的網友
(為什麼用VS2010示範,是因為這個安裝工具在VS2012以後就被拿掉了
但最近已經有解,請參考本篇最後一節)
如何撰寫服務網路上已有很多教學資料了
(打開專案選擇Windows服務,然後在Service1.cs寫code即可)
在此就不贅述,直接說明要如何把他打包成安裝檔
1. Service1.cs點右鍵,選擇「加入安裝程式」
專案會多出ProjectInstaller.cs這個檔案
包含了serviceProcessInstaller1跟serviceInstaller1這兩個項目
serviceProcessInstaller1通常會修改的只有Account這個屬性
關係到該服務使用的帳戶類型,預設User時在安裝會要求輸入登入的帳密
如果是LocalSystem類型就會要求Administrator權限
serviceInstaller1需要修改服務的名稱、描述等
ServiceName - 服務名稱
DisplayName - 顯示名稱
Description - 描述
StartType - 服務的啟動類型,分為自動、手動、停用
如果是常駐型的服務,請選擇Automatic
DelayedAutoStart - 延遲開始,一般選False
2. 方案中加入安裝專案
選擇[Visual Studio Installer]-[安裝專案]
3. 指定安裝專案要複製的檔案
右鍵選[加入]-[專案輸出]
選擇指定的專案,然後選[主要輸出]
他會將該專案編譯過的檔案都包含進來(包括必要的dll)
可以在主要輸出的Outputs屬性觀看會輸出的檔案
4. 加入專案額外的檔案
某些專案可能需要額外的資料檔
這些檔案也要在編譯時輸出到目錄
加入方式跟前面相同,[加入]-[專案輸出],選擇[內容檔]
不過當你檢查輸出後會發現,有些檔案竟沒有被加入,這是怎麼回事呢?
我檢查了一陣子才知道,原來需要設定資料檔的屬性
建置動作需設定為[內容]才會加入
順便一提,如果這些資料檔要跟執行檔放在同個目錄的話
複製到輸出目錄這一項請把[不要複製]改成別的選項
5. 設定安裝程式屬性
以下只舉部分重要例子
Product Name - 軟體名稱,會顯示在安裝畫面上
Manufacturer - 製造商名稱,注意這個項目會變成預設安裝的路徑
InstallAllUsers - 預設安裝給所有使用者,安裝時可修改
RemovePreviousVersions - 重新安裝時是否要先把舊版本移除
Title - Metadata的標題,注意不會顯示在安裝程式中
Author - Metadata的作者
TargetPlatform - 安裝平台,會影響預設安裝路徑
預設安裝目錄為C:\Program Files (x86)\(Manufacturer)\(ProduectName)
其中TargetPlatform若為x86會裝在Program Files (x86),反之是Program Files
6. 加入自訂動作,讓服務自動安裝
如果只修改了以上參數就直接安裝
應該會發現雖然安裝成功了,但是服務卻沒有裝進系統
這是因為我們目前的操作僅是把專案輸出檔案給複製過去,沒有設定安裝服務
所以我們需要加入自訂動作,安裝檔就會自動安裝/解除安裝服務了
安裝專案按右鍵,選[檢視]-[自訂動作]
出現畫面後,在自訂動作按右鍵選[加入自訂動作]
跳出詢問視窗後,雙擊[應用程式資料夾],再選[主要輸出]
7. 安裝
請先建置,注意不可選功能表的建置方案
原因是安裝專案一般不會自動加入建置專案
建置成功後,安裝專案按右鍵,選擇[安裝]即可
8. 安裝完後,服務沒有啟動?
這是正常的
不知道為什麼沒有安裝完後自動啟動服務的選項
但沒關係,如果真的想要自動啟動,可以靠額外code達成
在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服務?
其實這個問題跟安裝沒什麼關係,不過既然都提到服務了,就一起說明
Visual Studio可以選擇功能表的[偵錯]-[附加至處理序]
然後找到該服務並附加即可
要怎麼找呢?可以直接至[工作管理員]-[服務]看自己服務的PID
如果該服務是以SYSTEM方式登入的,請勾選[顯示所有使用者的處理序]才能看到
當附加後,就可以對程式下中斷點等處理了
11. Visual Studio 2012以後的版本能不能用這個工具?
不知為何,Visual Studio 2012以後這工具就被拿掉了,令人惋惜
(只剩下商業軟體InstallShield連結)
好消息是微軟最近為Visual Studio 2013開發出一款擴充套件
「Microsoft Visual Studio Installer Projects」
裝了之後,Visual Studio 2013就可以開啟過去無法開啟的vdproj檔了
(注意:僅支援VS2013,VS2012還是沒辦法 強迫大家升級)
可惜沒有支援多國語言,介面僅有英文版
留言列表