5

我有一个从Installer 类派生的现有(基于 C#)的 Windows 服务,我目前使用 MS 提供的命令行InstallUtil来安装和卸载它。这工作正常,作为我系统的一部分,我已将事件处理程序附加到 AfterUninstallEventHandler 和 CommittedEventHandler 事件。就我而言,我只是使用它们将消息记录到自定义事件日志中 - 显示安装和卸载日期和时间以及程序版本。

目前,我正在尝试使用Wix v3.5 Beta 1来打包我的一堆东西,包括这项服务,并且我正在使用 Wix ServiceInstall 和 ServiceControl 来替换我使用 InstallUtil 手动执行的操作。

然而,Wix 似乎使用与 InstallUtil 完全不同的机制来安装服务。这可以在 Wix 控制的服务的名称和描述中看到(与嵌入在服务程序中的内容相反),并且我的事件不再触发(如果使用不同的安装机制,我怀疑它们会)。

那么 Wix 是否有可能以与 InstallUtil 相同的方式执行服务安装,还是我只是要忍受这些差异?

编辑

Christopher 建议从我的代码中提取与服务相关的定义,并将它们移动到 Wix 安装程序项目中。这让我感到不安,因为现在我要么必须找到一种方法在两个独立的系统之间共享信息(我不知道如何在代码和 Wix 项目之间共享),要么忍受在两个不同的位置定义信息(非常糟糕软件实践)。

4

1 回答 1

3

从 Windows 安装程序的角度来看,InstallUtil 是一种邪恶的反模式,因为它将脆弱的进程代码注入声明性编程模型。Windows Installer 长期以来一直拥有 ServiceInstall 和 ServiceControl 表,这非常有效。这同样适用于 Regasm 和 Regserver。我们更喜欢提取 COM 数据并将其编写到安装程序中,并让 MSI 负责应用注册表值,而不是加载程序集并调用入口点以希望它能正常工作。当它失败时,你不知道为什么并且你不能回滚机器的状态。

你在你的活动中做什么样的事情?我会消除和/或将它们中的每一个重构为 MSI 可以为您做的事情。如果还不够,请编写一个 DTF 自定义操作并在 InstallServices 和 StartServices 之间安排它。

于 2010-07-13T21:34:28.630 回答