使用Windows Installer启动依赖于并行程序集的服务

使用Windows Installer启动依赖于并行程序集的服务,windows,installation,assemblies,windows-installer,side-by-side,Windows,Installation,Assemblies,Windows Installer,Side By Side,我们正在更新针对Windows Server 2008的产品的.msi包的结构。我们安装的主要组件是作为Windows服务运行的应用程序。还有一个在安装期间运行的配置应用程序,用于设置服务使用的注册表项 服务和配置应用程序依赖于Microsoft C/C++运行时和MFC,它们作为合并模块包含在.msi中。C/C++运行时和MFC的程序集在InstallFinalize期间提交,这似乎阻止了使用Windows Installer提供的机制启动服务(这是否正确?),当然,如果在InstallFin

我们正在更新针对Windows Server 2008的产品的.msi包的结构。我们安装的主要组件是作为Windows服务运行的应用程序。还有一个在安装期间运行的配置应用程序,用于设置服务使用的注册表项

服务和配置应用程序依赖于Microsoft C/C++运行时和MFC,它们作为合并模块包含在.msi中。C/C++运行时和MFC的程序集在InstallFinalize期间提交,这似乎阻止了使用Windows Installer提供的机制启动服务(这是否正确?),当然,如果在InstallFinalize之前运行配置应用程序,我们至少会看到配置应用程序出现并行错误

我们采取的方法是在InstallFinalize之后将配置应用程序作为“提交”自定义操作运行,并让该应用程序启动服务。这要求应用程序以提升的权限执行(为此,我们使用包含trustInfo节的清单)。这还要求.msi配置为在不模拟的情况下运行此应用程序(否则会混淆权限提升)

这是一个可以接受的方法吗?这可能是未来的证明吗?有什么需要注意的地方吗

这似乎是其他人遇到的问题:

有没有一种官方(或非官方)认可的方式来处理这些问题

作为本文的补充,是否有任何方法可以确保在安装过程中作为自定义操作运行的应用程序在启动时获得关注?以这种方式启动的应用程序似乎总是在安装程序后面弹出,并且安装程序保持焦点,这不是一种特别友好的效果

非常感谢,

布鲁斯

  • 您可以编译MFC&C-Runtime的静态使用,这样您就不会受到影响
  • 您可以将UI添加到安装程序中,这将充当配置程序,因此在安装过程中不需要运行配置程序(顺便说一句,这不是一个好主意)
  • 您可以在禁用模式下安装服务,并在安装程序终止时运行配置。配置将负责激活服务
  • 您可以编译MFC&C-Runtime的静态使用,这样您就不会受到影响
  • 您可以将UI添加到安装程序中,这将充当配置程序,因此在安装过程中不需要运行配置程序(顺便说一句,这不是一个好主意)
  • 您可以在禁用模式下安装服务,并在安装程序终止时运行配置。配置将负责激活服务

  • 在使用Windows Installer重新打包软件时,我使用了一个解决此类问题的解决方案:“引导”启动器。简而言之,您可以执行以下操作之一,而不是在运行时使用合并模块(所有模块将与所有其他安装的文件同时提交):

  • 为运行时/MFC提供可再发行的MSI,并让它们首先由引导程序setup.exe启动。您的程序的MSI当然必须测试您需要的版本是否已安装,甚至可能测试以确保您正在从setup.exe运行它。(InstallShield推广了这种方法,因为他们喜欢在Windows Installer中运行终端。)

  • 更好的是,您可以将MSI打包为安装两个(或更多)嵌入式MSI的父包:首先,安装所需的运行时,然后在子MSI中安装软件。您的父包将确认运行时的MSI已成功安装,然后继续安装您的MSI(由于前提条件已经存在,因此MSI可以自由启动服务)

  • 还有其他一些棘手的方法,比如您的早期提交自定义操作,但它们不像我刚才提到的那些经过时间测试的方法那样可靠


    希望这有意义!我曾经生活和呼吸MSI,但现在已经不那么多了……

    在使用Windows Installer重新打包软件时,我使用了一个解决方案:一个“引导”启动器。简而言之,您可以执行以下操作之一,而不是在运行时使用合并模块(所有模块将与所有其他安装的文件同时提交):

  • 为运行时/MFC提供可再发行的MSI,并让它们首先由引导程序setup.exe启动。您的程序的MSI当然必须测试您需要的版本是否已安装,甚至可能测试以确保您正在从setup.exe运行它。(InstallShield推广了这种方法,因为他们喜欢在Windows Installer中运行终端。)

  • 更好的是,您可以将MSI打包为安装两个(或更多)嵌入式MSI的父包:首先,安装所需的运行时,然后在子MSI中安装软件。您的父包将确认运行时的MSI已成功安装,然后继续安装您的MSI(由于前提条件已经存在,因此MSI可以自由启动服务)

  • 还有其他一些棘手的方法,比如您的早期提交自定义操作,但它们不像我刚才提到的那些经过时间测试的方法那样可靠

    希望这有意义!我曾经生活和呼吸微星,但现在不那么多了