没有[RunInstaller]的Windows服务

时间:2010-09-15 09:32:25

标签: .net deployment windows-services wix

我使用C#.NET编写了一个Windows服务。为了安装该服务,我添加了一个“Project Installer”类,该类继承自Installer类并使用[RunInstaller]进行修饰。

如果没有[RunInstaller]装饰,我无法使用 installutil 安装服务。

为什么通过使用MSI中的ServiceInstall表部署服务,MSI能够在没有[RunInstaller]装饰的情况下安装服务?

PS:我使用WiX创作MSI:

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

2 个答案:

答案 0 :(得分:3)

我在4年前撰写了一篇博客文章:

MSI vs .NET

基本上,专家级答案是安装程序类自定义操作是.NET社区发明的邪恶反模式。它们是RegSvr32模式的扩展,不适合MSI表驱动的声明性设计,不应使用。

服务控制管理器是一个非托管API(Advapi32.dll),它在.NET框架之前。在.NET出现之前,Windows Installer在1990年代已经为SCM提供了出色的支持。然后.NET出现了创建用于编写托管服务的模式,虽然从ServiceBase继承以获得大部分免费管道的能力是一件好事,但是使用InstalUtil却不是。

顺便说一句,你也应该下载到DOS并查看SC命令。这将允许您执行各种服务安装操作,以防您需要在开发环境中执行某些操作而不运行MSI。

答案 1 :(得分:1)

基本上WiX没有调用ProjectInstaller;它只是使用MSI表。

如果你真的需要调用ProjectInstaller(因为它设置了其他东西),那么你需要使用WiX custom action。请注意,这不是最佳选择(WiX-users)。