這裏是真正的獨家新聞:服務就是服務就是服務。這是我的座右銘。我的意思是我不在乎你是否正在使用C++ EXE,VB EXE,C#EXE,某些thunking主機EXE(如SrvAny.exe)......他們都實現了相同的API來與服務交互控制經理。
所以SrvAny將被SCM調用並獲得一個啓動命令。此時它將讀取註冊表值並知道如何運行其他EXE或腳本。當SrvAny獲得停止調用時,它將終止您的進程並將報告停止給SCM。
這就是服務運行的方式。我們來談談如何安裝它。有很多方法可以以編程方式創建服務(SC,InstSrv.exe,安裝程序類自定義操作等),但從MSI角度來看,並不需要它們。 Windows安裝程序具有ServiceInstall和ServiceControl表以及用於處理啓動,停止,創建和刪除Windows服務的標準操作。有時候,比如SrvAny.exe的情況,你會得到一些無法用這些表格表達的安裝程序要求,在這種情況下,你使用註冊表表格。對於SrvAny.exe,需要創建一個帶有註冊表數據的參數密鑰,該註冊表數據會教導SrvAny.exe啓動時實際調用的內容。
下面是維克斯樣本使用SRVANY.EXE運行腳本的NodeJS作爲服務:
<Component Id="c1" Guid="redacted">
<File Id="f1" Source="$(var.SourceDir)\srvany.exe" KeyPath="yes" />
<ServiceInstall Id="si1" DisplayName="MyService" Description="MyService" Name="MyService" Start="auto" Type="ownProcess" Vital="no" ErrorControl="normal" Account="NT AUTHORITY\NetworkService" />
<ServiceControl Id="sc1" Name="MyService" Remove="both" Stop="both" Start="install" Wait="yes" />
<RegistryValue Id="reg1" Root="HKLM" Key="SYSTEM\CurrentControlSet\Services\MyService\Parameters" Name="Application" Type="string" Value="node "[#f2]"" Action="write" />
</Component>
<Component Id="c2" Guid="redacted" KeyPath="yes">
<File Id="f2" Source="$(var.SourceDir)\server.js" />
</Component>
C#Express可能沒有項目類型的服務,但我不能想象爲什麼:我喜歡創建一個EXE項目並自己實現ServiceBase類。那麼你不需要SrvAny.exe – 2014-05-15 13:49:12