WIX在安装时运行vcredist_x64.exe

and*_*yne 7 wix vcredist visual-studio-2015

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

所以,我正在尝试创建一个自定义操作来执行此操作.我在这里遵循类似的教程,尽管它适用于VC Redistributable可执行文件.我需要做的第一件事是设置安装后将放置.exe文件的位置:

<Directory Id='APPLICATIONROOTDIRECTORY' Name='MyApp'>
  <Directory Id="VCREDISTDIR" Name="VCRedist">
  </Directory>
</Directory>
Run Code Online (Sandbox Code Playgroud)

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

<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>
Run Code Online (Sandbox Code Playgroud)

和...

<Feature Id="VCRedistributable" Title="Visual C++ Runtime" AllowAdvertise="no" Display="hidden" Level="1">
  <ComponentGroupRef Id="VCRedist" />
</Feature>
Run Code Online (Sandbox Code Playgroud)

此时,应将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>
Run Code Online (Sandbox Code Playgroud)

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

<UI>
  <ProgressText Action="InstallVCRedistributable">Installing Visual C++ Redistributable for Visual Studio 2015</ProgressText>
</UI>
Run Code Online (Sandbox Code Playgroud)

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

Pat*_*ood 5

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

可以在此处看到一个准系统示例,您可以按照需要安装的顺序在元素中添加<MsiPackage>和。<ExePackage>Chain


Gan*_*n11 5

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

你的其他选择似乎是像Patrick Allwood上面建议的那样创建一个引导程序,或者只是要求用户在运行你自己的安装程序之前自己安装vc_redist包.您可以检测,如果通用C运行时是通过检查已经存在ucrtbase.dllC:\Windows\System32:

<Property Id="UCRTINSTALLED">
  <DirectorySearch Id="UCRTSystemSearch" Path="[WindowsFolder]System32" Depth="0">
    <FileSearch Id="UCRTFileSearch" Name="ucrtbase.dll" MinVersion="10.0.10240.16389" />
  </DirectorySearch>
</Property>
Run Code Online (Sandbox Code Playgroud)

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

编辑:正如凯文史密斯提到的那样,版本ucrtbase.dll提出了一些奇怪的问题 - 向某些工具报告版本2.X,向其他工具报告版本10.Y. MinVersion如果您只想检查是否存在,可以删除该属性ucrtbase.dll.