2010-09-15 48 views
0

我使用C#.NET編寫了Windows服務。要安裝該服務,我添加了一個「Project Installer」類,它繼承了Installer類,並用[RunInstaller]進行了裝飾。沒有[RunInstaller]的Windows服務

沒有[RunInstaller]裝飾,我無法使用installutil安裝服務。

爲什麼通過在MSI中使用ServiceInstall表部署服務,MSI能夠在沒有[RunInstaller]裝飾的情況下安裝服務?

PS:我用維克斯來創作MSI:

<ServiceInstall Id="RegistryReaderInstall" DisplayName="Registry Reader Service" Name="Registry Reader" ErrorControl="critical" Start="auto" Type="ownProcess"/> 
+1

如果您想要完全跳過'InstallUtil.exe',有一種方法可以讓您的Windows服務遵循命令提示符中的命令行選項來安裝/卸載並啓動/停止自身。我已經寫了一個如何在這裏:http://stackoverflow.com/questions/1195478/how-to-make-a-net-windows-service-start-right-after-the-installation/1195621#1195621 – 2010-09-15 14:03:31

+0

謝謝馬特!我已經嘗試過你的指導,它工作得很好。 :)我只是想知道MSI如何在不使用InstallUtil的情況下安裝我的服務(因爲沒有[RunInstaller])。 – Ian 2010-09-16 04:35:59

回答

3

I 4年前寫了這一篇博客文章:

MSI vs .NET

基本上專家級的答案是,Installer類的自定義操作是由.NET社區發明了一個邪惡的反模式。它們是RegSvr32模式的擴展,不適合MSI表驅動的聲明式設計,因此不應使用。

服務控制管理器是一個非託管API(Advapi32.dll),它預先.NET框架。在.NET出現之前,Windows Installer已經在20世紀90年代爲SCM提供了出色的支持。然後,.NET創建了一個用於編寫託管服務的模式,雖然從ServiceBase繼承以獲得大部分免費管道的能力是一件好事,但使用InstalUtil並不是。

順便說一句,你也應該下降到DOS並簽出SC命令。這將允許您執行各種服務安裝操作,以防需要在開發環境中執行某些操作而無需運行MSI。

1

基本上維克斯不調用ProjectInstaller;它只是使用MSI表。

如果你真的需要調用ProjectInstaller(因爲它設置了其他東西),那麼你需要使用WiX custom action。請注意,這不被視爲最佳選項(WiX-users)。