我有一个从Installer class派生的现有(基于C#)的Windows服务,我目前使用MS提供的命令行InstallUtil来安装和卸载它。这工作正常,作为我的系统的一部分,我已将事件处理程序附加到AfterUninstallEventHandler和CommittedEventHandler事件。在我的情况下,我只是使用它们将消息记录到自定义事件日志 - 显示安装和卸载日期和时间以及程序版本。
目前我正在尝试使用Wix v3.5 Beta 1打包我的一些东西,包括这个服务,我正在使用Wix ServiceInstall和ServiceControl来替换我手动对InstallUtil执行的操作。
然而,似乎Wix使用与InstallUtil完全不同的机制来安装服务。这可以在Wix控制的服务的名称和描述中看到(与服务程序中嵌入的服务相反),并且我的事件不再触发(如果使用不同的安装机制,我怀疑他们会)。
因此,Wix可以像InstallUtil一样执行服务安装,还是我只想忍受差异?
修改
Christopher建议从我的代码中分解出与服务相关的定义,并将它们移到Wix安装程序项目中。这让我感到不安,因为现在我要么找到一种方法在两个独立的系统之间共享信息(我不知道如何在代码和Wix项目之间共享)或者在两个不同的位置定义信息(非常糟糕)软件实践)。
答案 0 :(得分:2)
从Windows安装程序的角度来看,InstallUtil是一个邪恶的反模式,因为它将脆弱的进程代码注入到声明性编程模型中。 Windows Installer长期以来一直使用ServiceInstall和ServiceControl表,这非常有效。这同样适用于Regasm和Regserver。我们更喜欢提取COM数据并将其创建到安装程序中,让MSI负责应用注册表值,而不是加载程序集和调用入口点以确保它有效。当它失败时,你不知道为什么,你不能回滚机器的状态。
你在活动中做了什么样的事情?我要么将它们中的每一个消除和/或重构成MSI可以为你做的事情。如果仍然不够,请编写DTF自定义操作并在InstallServices和StartServices之间进行安排。