【问题标题】:Wix Toolset install C++ 2010 RedistributableWix 工具集安装 C++ 2010 Redistributable
【发布时间】:2015-05-25 18:40:05
【问题描述】:

我可以通过 Wix 工具集将 Microsoft Visual C++ 2010 可再发行组件的安装与我的安装包集成在一起吗?

我使用自定义操作尝试了此操作,但如果正在进行另一次安装,它不会安装。有人对如何做到这一点有任何建议吗?

另外,还有一个问题:我可以在我正在创建的这个 MSI 安装程序中调用一个 MSI 安装程序吗?

【问题讨论】:

标签: wix visual-c++-2010 wix3.8 wix3.9


【解决方案1】:

您不能进行递归 MSI 安装 - 冒着明显的风险,当您收到“另一个安装正在进行中”的错误时,另一个安装就是您。

如果您使用合并模块来安装 VC 运行时,并且您有一个依赖于它们的 C++ 服务,您使用 StartServices (WiX ServiceControl) 启动,那么您可能会发现该服务无法启动。这是因为 C++ 运行时的 SxS 版本在 InstallFinalize 之前不可用,这是在 StartServices 操作之后。可能的解决方案是:

使用指向 C++ 运行时的静态链接构建服务,但随后对 VC++ 运行时 Dll 的更新将不会应用于您构建的二进制文件,以防出现问题。

在安装您自己的 MSI 文件之前,使用像 Burn 这样的引导程序来运行 VC++ redist exe。

将运行时 Dll 作为私有副本复制到您的应用文件夹,仅供您的应用使用。这种东西,老了,但我相信仍然适用:

http://blogs.msdn.com/b/vcblog/archive/2007/10/12/how-to-redistribute-the-visual-c-libraries-with-your-application.aspx

您在使用合并模块时可能遇到的另一个问题是它们需要按机器安装。如果您将它们包含在每个用户安装中,则安装将失败。

【讨论】:

    【解决方案2】:

    您可以使用 C++ 运行时合并模块安装 C++ 运行时文件:

    How To: Install the Visual C++ Redistributable with your installer

    关于你的第二个问题:不 - 这是不可能的。

    【讨论】:

    • 例如,如果我用 Microsoft_VC120_CRT_x86.msm 工作,但如果 Microsoft_VC100_CRT_x86.msm 用于创建服务,postgres 无法运行。