【问题标题】:WiX - VC++ Runtime - vcredist vs merge moduleWiX - VC++ 运行时 - vcredist 与合并模块
【发布时间】:2016-05-12 15:52:05
【问题描述】:

我正在使用 WiX 构建 MSI 安装程序。由于应该安装的产品需要 VC++ 运行时,我发现了两种选择,即(a)使用相应的合并模块和(b)在实际产品的 MSI 之前使用 burn 运行 vcredist。为了区分这两个选项,我有一些问题没有找到相关信息。

1) 如果使用合并模块,则运行时不会单独安装(添加和删除程序中没有条目),但据我所知,只需将所需文件复制到相应的位置。

1.1) 如果系统上已经安装了 vcredist,我想合并模块在产品安装期间什么都不做?

1.2) 如果存在 1.1) 中提到的 vcredist 安装,如果用户只是通过添加和删除程序卸载该运行时会发生什么?我想该产品不再工作(至少在执行修复安装之前导致 MSI 中的合并模块内容重新添加必要的文件?)

1.3) 如果 vcredist 尚未安装并且 MSI 安装程序将文件复制到系统,然后另一个安装程序或用户正在调用 vcredist.exe,那么会发生什么? vcredist 是否报告运行时已安装?

1.4) 如果卸载产品,通过合并模块复制到系统的文件是否被删除?

1.5) 如果对 1.4) 的回答是(删除 VC++ 运行时文件):如果系统上安装了两个不同的产品,两者都在内部使用相同的合并模块,并且卸载了两个产品中的一个,会发生什么情况安装运行时文件?由于缺少运行时文件,它们是否被删除并且其他产品不再工作?

提前感谢您的帮助和信息。

问候, 贡纳尔

【问题讨论】:

    标签: wix windows-installer installation vcredist


    【解决方案1】:

    合并模块只是通过将文件包含在构建中来正确安装(通常是共享)文件的一致方式。打个比方,C++ 编译器构建 .obj 文件,这些文件组合成一个 exe,但你不能再谈论一个 obj 在构建和运行 exe 后具有单独的存在。合并模块也是如此。一旦它们进入 MSI,它们就只是要安装的文件,并且它们遵循标准规则。如果文件已经安装(在共享位置),如果传入的版本高于已安装的版本,它将被覆盖。其包含的组件将 ref 加一,并且使用该组件卸载其他产品(包括 VC redist)将 ref 倒计时,以便使用该文件的任何产品都不会中断 - 仍然有一个版本供他们使用。这只是产品之间共享文件的标准共享方法,一个产品是 VC redist 而另一个是您的 MSI 没有区别。您的几个产品也可以很容易地使用合并模块安装文件,并且每个产品都可以在不破坏其他产品的情况下卸载,因为引用计数以及共享位置和公共组件 ID 使共享按预期工作的事实。所以忘记一个产品是 VC redist 而另一个是你的(或另一个使用相同文件的产品) - 这只是 Windows Installer 的共享文件/引用计数机制。

    这是用于将文件安装到系统文件夹的最新合并模块。还有其他使用 WinSxS 的方案和现在似乎没有使用的策略重定向(VS 2015)。

    【讨论】:

    • 感谢您的澄清。我对合并模块的使用感到有点困惑,因为我发现了一些帖子和描述,它们更喜欢并建议将 Burn 与 vcredist.exe 一起使用,并且通过将它们链接到合并模块使用上来安装产品,而没有给出不使用合并模块的可理解的理由。由于引导程序总是创建 exe 文件而不是 msi 文件(后者是我公司分发安装程序的首选方式),我想知道是否有必要实际更喜欢 vcredist.exe 链接而不是 MM,这似乎没有就是这样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多