我使用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"/>
答案 0 :(得分:3)
我在4年前撰写了一篇博客文章:
基本上,专家级答案是安装程序类自定义操作是.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)。