【问题标题】:WiX install C++ redistributable in msiWiX 在 msi 中安装 C++ 可再发行组件
【发布时间】:2013-02-24 02:31:55
【问题描述】:

继我的上一个问题Why does my WiX Custom action throw a System.IO.FileNotFoundException? 之后,我现在正尝试将 C++ 分发包安装为我的 msi 的一部分。

我已按照文档中的示例进行操作; http://wix.sourceforge.net/manual-wix3/install_vcredist.htm

<DirectoryRef Id="TARGETDIR">
      <Merge Id="VC_Redist" SourceFile="$(env.ProgramFiles)\Common Files\Merge Modules\Microsoft_VC100_CRT_x86.msm" DiskId="1" Language="0"/>
    </DirectoryRef>

    <Feature Id="Complete" Level="1" Title="$(var.NVRProduct) $(var.NVRVersion)" Description="Everything" Display="expand">
      <Feature Id="VC_Redist" Title="Visual C++ Runtime" AllowAdvertise="no" Display="hidden" Level="1">
        <MergeRef Id="VC_Redist"/>
      </Feature>      
    </Feature>

它不起作用。未安装 C++ 发行版,随后我的 msi 由于缺少 C++ 发行版而引发错误,并自行卸载。

这似乎和这个问题一样,没有得到真正的回答。 C++ Redistributable package with WIX

任何想法表示赞赏。

【问题讨论】:

    标签: wix windows-installer


    【解决方案1】:

    我将回答我自己的问题,因为我在进一步调查后发现了许多问题。

    首先,安装 VC++ 合并模块确实有效!

    我不认为这是因为我仍然收到错误,并且我无法在添加删除程序中看到 VC++ 运行时的条目,就像手动安装它一样。

    但是,通过将安装更改为仅安装可分发文件和应用程序直到我收到错误的位置,我可以看到实际安装了 VC++ dll。我现在看到的错误是因为该程序也需要 ATL 可再发行组件。 (正如我通过使用 Dependency Walker 发现的那样)。该错误导致 msi 失败,VC++ dll 与我的其他应用程序 dll 一起被卸载!

    一旦我按照帮助文件中的示例使用机制提供了 VC++ 和 ATL 可分发文件,一切都很好。

    我还使用了静态链接的 SQLite dll,因为即使安装了可分发文件,从自定义操作对 SQLite 的初始调用也失败了。我认为这一定是由于安装顺序问题。然而,使用静态链接版本在此处的开发人员中引起了一定程度的讨论,大约 50-50 的人赞成使用它,强烈反对使用它。

    不过,现在可以安装了。

    【讨论】:

      【解决方案2】:

      听起来您的自定义操作要么安排在 InstallFiles 操作之前,要么不延迟,或两者兼而有之。您不提供自定义操作定义,但请确保您的 CustomAction 元素将 Execute 属性设置为 'deferred' 并确保您的 Custom 元素在 InstallExecuteSequence 计划的 After='InstallFiles' 中。

      或者,您可以考虑将 CRT 静态链接到您的自定义操作中。我始终推荐此选项,因为它使您的自定义操作独立,从而大大增加了自定义操作始终有效的机会(包括在安装、修复、卸载和修补期间)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-12-04
        • 1970-01-01
        • 2017-06-17
        • 1970-01-01
        • 1970-01-01
        • 2022-01-20
        • 1970-01-01
        相关资源
        最近更新 更多