【问题标题】:How can I rollback or cancel an MSI project in C#?如何在 C# 中回滚或取消 MSI 项目?
【发布时间】:2010-12-30 07:32:43
【问题描述】:

我正在尝试构建一个 MSI 项目,并且在安装过程中我正在安装一个 Windows 服务。如果该服务安装失败,我想发起回滚并取消安装。

我已经构建了一个安装程序类并覆盖了安装和卸载方法。如何启动回滚?

【问题讨论】:

  • 您想从哪里开始回滚?这是来自自定义操作吗?
  • 是的,我有一个安装程序类,它在自定义操作中添加到安装过程中,如果安装失败,它会安装一个 Windows 服务,我希望它在整个安装过程中失败并删除所有文件。
  • 尝试从您的自定义操作中返回 1602:msdn.microsoft.com/en-us/library/aa369778(VS.85).aspx

标签: c# windows-services windows-installer


【解决方案1】:

首先,您应该知道使用 InstallUtil 自定义操作(不管它们是如何记录和编写的)不是一个好的选择。把它们丢掉。用于执行自定义操作的 Visual Studio 部署项目也是如此。

最佳解决方案在于利用 Windows Installer 内置支持来创建和启动服务。使用 InstallShield 2010 Limited Edition(免费)或 Windows Installer XML (FOSS)。这些工具公开了 ServiceControl 表,该表有一个 Wait 列,允许您教 MSI:

等待
将此字段留空或 输入值 1 会导致 安装程序最多等待 30 服务完成的秒数 在继续之前。等待可以 用于允许额外的时间 返回失败的关键事件 错误。此字段中的值为 0 意味着只等到服务 控制管理器 (SCM) 报告说 此服务处于待处理状态 在继续之前 安装。

ServiceControl Table

【讨论】:

  • 看来我认为 2010 LE 支持 ServiceControl/ServiceInstall 表是错误的。一种解决方法是使用 WiX 创建一个包含服务的合并模块,然后使用 InstallShield 表中的合并模块。
  • 注意:我相信最近发布的 VS2013 ISLE 现在支持 ServiceInstall/ServiceControl。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-22
相关资源
最近更新 更多