WiX在msi中安装C ++可再发行组件

时间:2013-03-08 14:07:38

标签: wix windows-installer

继我的上一个问题Why does my WiX Custom action throw a System.IO.FileNotFoundException?之后,我现在正试图将C ++ distributable作为我的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 ++ distributable,随后我的msi因缺少C ++发行版而抛出错误,并自行卸载。

这似乎和这个问题是一样的,但这个问题并未真正得到解答。 C++ Redistributable package with WIX

任何想法都赞赏。

2 个答案:

答案 0 :(得分:3)

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

首先,VC ++合并模块的安装实际上正在运行!

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

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

根据帮助文件中的示例,我使用机制提供了VC ++和ATL可分发项,但一切都很顺利。

我还使用了静态链接的SQLite dll,即使安装了distributables,从自定义操作对SQLite的初始调用也失败了。我认为这必然是由于安装顺序问题。但是,使用静态链接版本已经引起了开发人员的一定程度的讨论,大约有50-50分支赞成并强烈反对使用它。

然而,安装现在可以正常工作。

答案 1 :(得分:1)

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

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