如何在自定义操作中使用VS Installer类

时间:2011-03-17 17:15:04

标签: installer windows-installer custom-action

我发现的几十个Q& A条目(除了一个在stackoverflow中!)接近这个问题,但没有教我需要什么。我有一个几乎简单的安装:Windows服务和相关的托盘图标应用程序。它们与标准的VS Setup项目一起安装得很好。安装文件后,我需要向用户提供一个对话框,以在服务的exe.config文件中设置一些参数。在该对话框中,用户应该能够中止安装。我已经尝试了两种自定义操作流程的方法,并且在进行安装回滚时遇到了一个问题。

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

  1. 当应用退出时(在用户选择取消后),安装会显示一条错误消息,指出安装存在问题,用户应与供应商联系。由于情况并非如此,我更喜欢更正确的消息(“用户取消安装”)或根本没有消息。
  2. 两个项目输出(服务和托盘应用程序)必须列在所有四个自定义操作部分下,否则我的对话框将不会出现。相反,会出现有关缺少的InstallState文件的错误,并且安装始终失败。直观地说,这似乎是错误的。
  3. 方法2:安装程序作为自定义操作,在安装或提交时运行。 这对我来说比较干净(只有自定义操作中列出的一个项目),但是让回滚过程比方法1更糟糕。似乎我必须在重写方法(Install / Commit)中抛出一个异常,然后在回滚发生之前给我几个错误对话框,然后回滚并不总是卸载服务。

    在没有使用WiX或类似选项的情况下,最简洁的方法是什么?

2 个答案:

答案 0 :(得分:0)

我推荐这种方法:

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

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

Visual Studio不支持此方法,但可以使用免费或商业安装创作工具完成此操作。

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

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

答案 1 :(得分:0)

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

Deployment Tools Foundation joins the WiX toolset.

Deployment Tools Foundation (DTF) Managed Custom Actions