Windows服務的安裝方法總結
C#建立Windows服務與安裝-圖解
百度經驗:jingyan.baidu.com
一、第一種安裝方法
使用.net framework自帶的安裝服務的程式進行安裝
建立項目1
建立windows服務項目
右鍵點選Service1.cs,檢視代碼, 用于編寫操作邏輯代碼
代碼中OnStart用于執行服務事件,一般采用線程方式執行方法,便于隔一段事件執行一回
安裝服務配置
打開Service1.cs視圖界面
在視圖内右鍵-->添加安裝程式
項目中添加了ProjectInstaller.cs檔案,該檔案中視圖自動會添加倆個元件
serviceProcessInstaller1
serviceInstaller1
選中serviceProcessInstaller1元件,檢視屬性,設定account為LocalSystem
選中serviceInstaller1元件,檢視屬性
設定ServiceName的值, 該值表示在系統服務中的名稱
設定StartType, 如果為Manual則手動啟動,預設停止,如果為Automatic為自動啟動
設定Description,添加服務描述
安裝服務1
點選 開始,運作中輸入cmd,擷取指令提示符
win7需要以管理者的身份啟動,否則無法安裝
輸入 cd C:\Windows\Microsoft.NET\Framework\v4.0.30319回車
切換目前目錄,此處需要注意的是,在C:\Windows\Microsoft.NET\Framework目錄下有很多類似版本,具體去哪個目錄要看項目的運作環境,例如果是.net framework2.0則需要輸入cd C:\Windows\Microsoft.NET\Framework\v2.0.50727
輸入InstallUtil.exe E:\TestApp\Winform\WinServiceTest\WinServiceTest\bin\Debug\WinServiceTest.exe回車
說明:E:\TestApp\Winform\WinServiceTest\WinServiceTest\bin\Debug\WinServiceTest.exe表示項目生成的windowsservice主輸出檔案位置
打開服務,就可以看到已經安裝的服務了
解除安裝服務:1
解除安裝很簡單,打開cmd, 直接輸入 sc delete WinServiceTest便可
第二中安裝方法
使用windows批處理方法進行安裝
1.服務項目完成之後,在服務解決方法中建立一個windows批處理檔案命名為:InstallService.bat
檔案中的内容書寫如下:
@echooff
echo--------------------------------------------------------------
echo- 開始安裝服務 -
echo--------------------------------------------------------------
pause
set appdir=%cd%\SimulateHexiaoWindowsService.exe
setAddr=C:\Windows\Microsoft.NET\Framework\v2.0.50727
cd/d %Addr%
installutil.exe %appdir%
IFERRORLEVEL 255 GOTO Label255
IFERRORLEVEL 254 GOTO Label254
IFERRORLEVEL 1 GOTO Label1
GOTOLabel0
:Label255
echocommands to be executed at errorlevel 255
GOTOEnd
:Label1
echocommands to be executed at errorlevel 1
GOTOEnd
:Label0
echo--------------------------------------------------------------
echo- 成功安裝服務
echo--------------------------------------------------------------
pause
:End
1. 建立一個解除安裝服務的windows批處理檔案 命名為:
UnInstallService.bat
@echooff
echo--------------------------------------------------------------
echo- 開始解除安裝服務
echo--------------------------------------------------------------
pause
setappdir=%cd%\SimulateHexiaoWindowsService.exe
setAddr=C:\Windows\Microsoft.NET\Framework\v2.0.50727
cd/d %Addr%
installutil.exe /u %appdir%
IFERRORLEVEL 255 GOTO Label255
IFERRORLEVEL 254 GOTO Label254
IFERRORLEVEL 1 GOTO Label1
GOTOLabel0
:Label255
echocommands to be executed at errorlevel 255
GOTOEnd
:Label1
echocommands to be executed at errorlevel 1
GOTOEnd
:Label0
echo--------------------------------------------------------------
echo- 成功解除安裝服務
echo--------------------------------------------------------------
pause
:End
注意:此處需要注意的同樣如一方法中所說,如果建立的服務項目架構是.Net framework 2.0的則要把批處理檔案中的設定改為setAddr=C:\Windows\Microsoft.NET\Framework\v2.0.50727如果是.Netframework 4.0的話,這要修改為set Addr=C:\Windows\Microsoft.NET\Framework\v4.0.30319,本質上該方法和第一種方法是一樣的。
三、使用vs的安裝項目的安裝方法來安裝
1.建立window服務項目
首先我們建一個window服務項目 :解決方案(右擊)——>增加 ——>建立項目——>項目類型選擇Windows——>模闆選擇Windows服務
2.編寫Window服務程式
建立後會生成兩個檔案 Program.cs和Service1.cs,其中 program.cs這個檔案不用動,裡面已自動生成好了。我們在Service1.cs裡增加所要的操作,裡面有兩個重寫方法 OnStart和 OnStop,OnStart方法表示服務啟動的操作,OnStop表示服務停止的操作,下面寫了一個簡單示例 :當服務啟動後,調用遠端一個WebService的Hello函數,并把傳回的值寫入到一個檔案中。code如下:
/// <summary>
/// 服務啟動的操作
/// </summary>
/// <param name="args"></param>
protected override void OnStart(string[] args)
{
Start ();
}
/// <summary>
/// 服務停止的操作
/// </summary>
protected override void OnStop()
{
try
{
ThreadHello.Abort();
Flag = false;
System.Diagnostics.Trace.Write("線程停止");
}
catch (Exception ex)
{
System.Diagnostics.Trace.Write(ex.Message);
}
}
private Thread ThreadHello;
private void Starto()
{
try
{
// 标準形式
//ThreadStart NewThreadStart = new ThreadStart(VoidName);
//Thread NewThead = new Thread(NewThreadStart);
//NewThead.Start();
ThreadHello = new Thread(new ThreadStart(Hello));
ThreadHello.Start();
System.Diagnostics.Trace.Write("線程任務開始");
}
catch (Exception ex)
{
System.Diagnostics.Trace.Write(ex.Message);
throw ex;
}
}
private void Hello()
{
while (Flag)
{
localhost.AdvService la = new WindowsService1.localhost.AdvService();
try
{
string helloname = la.Hello("Andy"); // 調用遠端WebService中的方法
writeInLog(helloname, false); // 把調用傳回的資料寫入到檔案中
}
catch (Exception ex)
{
System.Diagnostics.Trace.Write(ex.Message);
throw ex;
}
Thread.Sleep(5000);
}
}
/// <summary>
/// 寫入檔案操作
/// </summary>
/// <param name="msg">寫入内容</param>
/// <param name="IsAutoDelete">是否删除</param>
private void writeInLog(string msg, bool IsAutoDelete)
{
try
{
string logFileName = @"E:\Sample\PG_Sample\log.txt"; // 檔案路徑
FileInfo fileinfo = new FileInfo(logFileName);
if (IsAutoDelete)
{
if (fileinfo.Exists && fileinfo.Length >= 1024)
{
fileinfo.Delete();
}
}
using (FileStream fs = fileinfo.OpenWrite())
{
StreamWriter sw = new StreamWriter(fs);
sw.BaseStream.Seek(0, SeekOrigin.End);
sw.WriteLine("=====================================");
sw.Write("添加日期為:" + DateTime.Now.ToString() + "\r\n");
sw.Write("日志内容為:" + msg + "\r\n");
sw.WriteLine("=====================================");
sw.Flush();
sw.Close();
}
}
catch (Exception ex)
{
ex.ToString();
}
}
例子很簡單,友善了解,上面通過線程,每5秒執行一次操作,到這裡,我們的服務以及服務實作的功能就已經寫好了,下面怎麼讓用戶端安裝我們的服務呢?這裡才是我寫這篇文章的目的!先要增加一個安裝程式類,切換到視圖視窗,右擊——>增加安裝程式,便會增加一個程式安裝類檔案ProjectInstaller.cs。
這裡serviceProcessInstaller1和 serviceInstaller1有幾個重要屬性要設定,serviceInstaller1中的StartType要設定成Automatic,表示随機啟動,ServiceName表示服務名稱,Description表示服務的描述, DisplayName表示顯示名稱。serviceProcessInstaller1中的Account要設定成LocalSystem,表示本地系統帳号
3.安裝程式
安裝程式制作:解決方案(右擊)——>增加 ——>建立項目 ——>項目類型選擇安裝和部署——> 模闆選擇安裝項目 如圖 :
建立後,安裝項目(右擊)——>視圖 ——>檔案系統如圖:
由于我們是安裝服務,就不需要使用者桌面和程式菜單了,直接應用程式檔案夾(右擊)——>增加 ——>項目輸出 入圖 :
上面有兩點需要注意 ,一 項目選擇中選擇要安裝的服務, 二 項目選擇下面要選擇主輸出,選擇好後确定,這一步增加了安裝程式的檔案夾,下一步就是給這個安裝程式增加操作,這裡我們增加兩個基本操作,一個是安裝,一個是解除安裝。安裝項目(右擊) ——>視圖 ——> 自定義操作 如圖
上面可以看到有安裝,送出,復原,解除安裝等操作,我們先增加安裝操作,安裝(右擊)——>增加自定義操作,會彈出一個對話 如圖:
選擇應用程式檔案夾,并選中之前增加的主輸出項,确定,這樣這個安裝程式就增加了安裝的操作,同樣按照這樣的方式增加解除安裝操作,解除安裝與安裝唯一不同的是需要設定一個指令參數,不可少,如圖:
這裡 Arguments裡輸入 /u 表示解除安裝指令相當于InstallUtil.exe /u 服務路徑 ,到這裡 ,我們的安裝程式就已經制作好了,生成安裝程式項目,将會生成 setup.exe和 setup.msi安裝檔案,拷貝到用戶端,點選setup.exe就像安裝其他windows程式一樣安裝我們的服務