继我的上一个问题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
任何想法都赞赏。
答案 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静态链接到自定义操作中。我总是推荐这个选项,因为它使您的自定义操作独立,这大大增加了自定义操作始终有效的可能性(包括在安装,修复,卸载和修补期间)。