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++ 可再发行包

任何想法表示赞赏。

4

2 回答 2

3

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

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

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

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

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

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

但是,安装现在可以正常工作了。

于 2013-03-11T11:03:13.383 回答
1

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

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

于 2013-03-08T16:46:07.617 回答