WiX在msi安装程序中安装C++可再发行程序

3
继上一篇问题“为什么我的WiX自定义操作会抛出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++分发而抛出错误,并卸载自身。

这似乎与这个问题相同,该问题并没有得到真正的回答。 使用WIX的C++可再分发包

任何想法都将受到赞赏。

2个回答

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

首先,VC++合并模块的安装实际上是有效的!

我以为它没有起作用,因为我仍然在收到错误信息,而且我无法在添加删除程序中看到VC++运行时的条目,就像你手动安装一样。

但是,通过将安装更改为仅安装分发文件和应用程序,直到我收到错误消息,我可以看到VC++ dll实际上正在被安装。我现在看到的错误是因为程序还需要ATL redistibutable。(通过使用Dependency Walker发现)。该错误导致msi失败,并且VC++ dll与我的应用程序dll一起被卸载!

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

我还使用了静态链接的SQLite dll,即使安装了分发文件,从自定义操作中对SQLite进行的最初调用也会失败。我认为这可能是由于安装顺序问题造成的。但是,在这里,使用静态链接版本引起了一些开发人员之间的讨论,大约50-50的人支持它,强烈反对使用它。

现在,安装已经可以正常工作。


1
似乎你的自定义操作是在InstallFiles操作之前调度的,或者没有延迟执行,或两者都有。你没有提供自定义操作的定义,但请确保你的CustomAction元素将Execute属性设置为'deferred',并确保你的Custom元素在InstallExecuteSequence中按照After='InstallFiles'进行调度。
另外,你可以考虑将CRT静态链接到你的自定义操作中。我总是推荐这个选项,因为它使你的自定义操作独立于其他部分,大大增加了自定义操作始终正常工作的机会(包括安装、修复、卸载和打补丁)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接