WIX在安装时运行vcredist_x64.exe

时间:2016-01-15 16:28:08

标签: wix visual-studio-2015 vcredist

我有一个在VS 2015中编译的应用程序,需要VC++ Redistributable包才能正常运行。在此最新版本之前,我们使用的是旧版本的VS,只是使用合并模块来处理相应redist文件的安装。但是,我注意到在2015年使用最新版本的合并模块(Microsoft_VC140_CRT_x64.msm)时,我的应用程序仍然无法开箱即用。 I did some digging并且似​​乎有些事情已经随着最新版本的合并模块而改变。看来微软现在建议直接安装vcredist_x64.exe软件包,而不是使用合并模块。

所以,我正在尝试创建一个自定义操作来执行此操作。我正在关注similar tutorial here,尽管它适用于VC Redistributable可执行文件。我需要做的第一件事是设置安装后将放置.exe文件的位置:

<Directory Id='APPLICATIONROOTDIRECTORY' Name='MyApp'>
  <Directory Id="VCREDISTDIR" Name="VCRedist">
  </Directory>
</Directory>

然后,我需要将我的文件添加到一个组件组中,该组件组将作为隐藏功能的一部分进行安装(因为我希望自动安装它)。

<ComponentGroup Id="VCRedist" Directory="VCREDISTDIR">
  <Component Id="vcredist_x64.exe" Guid="-INSERT-GUID-HERE-" Win64="yes">
    <File Id="VCREDISEXE" Name="vcredist_x64.exe" KeyPath="yes" Source="$(var.VCRedistSourceDir)" Checksum="yes"></File>
  </Component>
</ComponentGroup>

和...

<Feature Id="VCRedistributable" Title="Visual C++ Runtime" AllowAdvertise="no" Display="hidden" Level="1">
  <ComponentGroupRef Id="VCRedist" />
</Feature>

此时,应将vcredist_x64.exe复制到最终用户的计算机。现在,我需要创建一个自定义操作以在安装后启动可执行文件。

<CustomAction Id="InstallVCRedistributable"
          FileKey="VCREDISEXE"
          Execute="deferred"
          ExeCommand="/silent"
          Impersonate="no"
          Return="check"/>

<InstallExecuteSequence>
  <Custom Action="InstallVCRedistributable" Before="InstallFinalize">
    <![CDATA[NOT REMOVE]]>
  </Custom>
</InstallExecuteSequence>

我还在我的UI中包含一条状态消息,以便我可以看到可执行文件的执行时间。

<UI>
  <ProgressText Action="InstallVCRedistributable">Installing Visual C++ Redistributable for Visual Studio 2015</ProgressText>
</UI>

现在,当我运行我的安装程序时,它应该启动vcredist_x64.exe ...它确实......但是在安装该可执行文件时它会被挂起。我收到一条弹出消息,指出此Windows Installer程序包存在问题,并且作为安装程序的一部分运行的程序未完成。然后它回滚我的主应用程序安装,永远不会安装。任何人都可以解释为什么会发生这种情况以及如何解决它?谢谢!

3 个答案:

答案 0 :(得分:5)

我发现了这个问题并自己尝试过,处于同样的情况。我发现您遇到的安装程序错误是/是错误1618:“另一个安装已在进行中。”似乎在您自己的安装程序中运行vc_redist安装程序根本不起作用。

您的其他选项似乎正在创建一个自适应Patrick Notwood上面建议的引导程序,或者只是要求用户在运行您自己的安装程序之前自己安装vc_redist包。您可以通过检查ucrtbase.dll中的C:\Windows\System32来检测Universal C Runtime是否已存在:

<Property Id="UCRTINSTALLED">
  <DirectorySearch Id="UCRTSystemSearch" Path="[WindowsFolder]System32" Depth="0">
    <FileSearch Id="UCRTFileSearch" Name="ucrtbase.dll" MinVersion="10.0.10240.16389" />
  </DirectorySearch>
</Property>

如果您只有32位安装程序,则还可以直接使用[SystemFolder]属性。

编辑:正如Kevin Smyth所提到的,ucrtbase.dll的版本提出了奇怪的问题 - 向某些工具报告版本2.X,向其他工具报告版本10.Y.如果您只想检查是否存在MinVersion,则可以删除ucrtbase.dll属性。

答案 1 :(得分:4)

我认为在拥有自己的安装程序的先决条件时采取的正确方法是创建一个WiX引导程序包,它依次运行每个安装程序。这可以处理安装失败时的回滚等问题,从安装程序中运行自定义操作时不会这样做。

可以看到准系统样本here,您需要在<MsiPackage>元素中按照您需要安装的顺序添加<ExePackage>Chain

答案 2 :(得分:0)

我遇到了类似的问题(在this closed问题中进行了充分描述,实际上使我在这里重定向)。我能够受this entry about running the application after setup的启发解决它。

关键部分基本上是向启动vcredist安装程序的UI添加最后一步:

<UI Id="UI_Main">
  <!-- ...... -->
  <Publish Dialog="ExitDialog"
           Control="Finish"
           Event="DoAction"
           Value="InstallVCRedistributable">1</Publish>
</UI>

关于自定义操作:

<CustomAction Id="InstallVCRedistributable"
              FileKey="VCREDISEXE"
              ExeCommand="/install /passive /norestart"
              Impersonate="yes"
              Return="asyncNoWait" />