我有一个从
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项目之间共享)或者在两个不同的位置定义信息(非常糟糕)软件实践).
最佳答案 从Windows安装程序的角度来看,InstallUtil是一个邪恶的反模式,因为它将脆弱的进程代码注入到声明性编程模型中. Windows Installer长期以来一直使用ServiceInstall和ServiceControl表,这非常有效.这同样适用于Regasm和Regserver.我们更喜欢提取COM数据并将其创建到安装程序中,让MSI负责应用注册表值,而不是加载程序集和调用入口点以确保它有效.当它失败时,你不知道为什么,你不能回滚机器的状态.
你在活动中做了什么样的事情?我要么将它们中的每一个消除和/或重构成MSI可以为你做的事情.如果仍然不够,请编写DTF自定义操作并在InstallServices和StartServices之间进行安排.