【问题标题】:How to use VS Installer class in a Custom Action如何在自定义操作中使用 VS Installer 类
【发布时间】:2016-07-20 16:44:47
【问题描述】:

我发现数十个问答条目(除了一个在 stackoverflow 中!)与这个问题很接近,但并没有教我我需要什么。我有一个几乎简单的安装:一个 Windows 服务和一个关联的托盘图标应用程序。他们使用标准的 VS Setup 项目安装得很好。安装文件后,我需要向用户显示一个对话框,以便在服务的 exe.config 文件中设置一些参数。在该对话框中,用户应该能够中止安装。我尝试了两种自定义操作过程的方法,但在使安装回滚时都遇到了困难。

方法 1:自定义操作的 exe,在提交时运行。 这类作品。应用程序返回一个非零退出代码并发生安装回滚。我不喜欢的是:

  1. 当应用程序退出时(用户选择取消后),安装会显示一条错误消息,指出安装存在问题,用户应联系供应商。由于情况并非如此,我希望得到更正确的消息(“用户取消安装”)或根本没有消息。
  2. 两个项目输出(服务和托盘应用程序)必须在所有四个自定义操作部分下列出,否则我的对话框将不会出现。相反,会出现有关缺少 InstallState 文件的错误,并且安装总是失败。直觉上,这似乎是错误的。

方法 2:安装程序作为自定义操作,在安装或提交时运行。 这对我来说更干净(只有自定义操作中列出的一项),但是让进程回滚比方法 1 更糟糕。看来我必须在覆盖的方法(安装/提交)中抛出异常,这然后在回滚发生之前给我几个错误对话框,然后回滚并不总是卸载服务。

在不使用 WiX 或类似选项的情况下完成这项工作的最简洁方法是什么?

【问题讨论】:

    标签: installation windows-installer custom-action


    【解决方案1】:

    简单的答案是不要使用 VS 安装程序类。它们有许多基本的设计缺陷。我建议您改为查看 Windows Installer XML (WiX) 部署工具基础 (DTF)。 DTF 是一个非常出色的托管模型/互操作库,适用于您的托管代码,并输出与 C/C++ 自定义操作兼容的 DLL(从 MSI 角度)。它们可以被任何 MSI 创作工具用作自定义操作,而不仅仅是 WiX 安装程序。

    Deployment Tools Foundation joins the WiX toolset.

    Deployment Tools Foundation (DTF) Managed Custom Actions

    【讨论】:

    • 谢谢,克里斯(和@Cosmin)。所以,我在没有一些额外工具的情况下就走了一条小河?在过去的几天里,我对 WiX 教程感到不知所措,但我确实安装了它并用 Votive 玩了一些。与 VS 的集成很有吸引力,如果这是要走的路,我现在缺少的是一个几乎简单的例子,它让我端到端地完成整个过程。我不知道如何使用 DTF 添加的整洁的东西,也没有任何东西告诉我如何为具有 3 个项目程序集的 VS 应用程序构建 WiX 文件。我必须买这本书吗,还是在某个地方有以 VS 为中心的教程?
    • DTF 将您的 C# 转换为 C++ 等效的 DLL 自定义操作。 Visual Studio 也可以编写 C++ DLL 自定义操作,因此它应该易于集成。否则我的博客上有 VDPROJ、DTF、WiX 的示例供您浏览。
    • 我搜索了您的存档(回到 5/2008)并找到了有关 DTF 的 cmets 以及您对使用它的讨论(这实际上是我所有兴趣的开始),但没有完整的示例。我错过了吗?我感觉我所缺少的东西被许多人认为太微不足道而无法在他们的作品中涵盖,但我只是停留在这一点上。
    【解决方案2】:

    我推荐这种方法:

    • 创建一个自定义安装对话框,询问用户您的选项
    • 使用此对话框设置的安装程序属性来修改您的服务配置文件(您可以使用自定义操作或其他设置创作工具的 XML 支持)

    通过这种方式,在安装之前收集信息,用户也可以毫无问题地中止安装。

    Visual Studio 不支持这种方法,但可以使用免费或商业设置创作工具来完成。

    如果您想坚持使用自定义操作,可以试试这个:

    • 确保您的自定义操作被延迟并且在提交期间不运行(提交意味着安装已执行且没有回滚)
    • 使用 Win32 DLL 显示您的自定义对话框;这样您就可以return ERROR_INSTALL_USEREXIT (1602) 显示更友好的用户退出对话框,而不是致命错误对话框

    【讨论】:

      猜你喜欢
      • 2021-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-09
      • 2022-01-11
      相关资源
      最近更新 更多