【问题标题】:WIX run vcredist_x64.exe on installWIX 在安装时运行 vcredist_x64.exe
【发布时间】:2021-02-09 08:52:59
【问题描述】:

我有一个在 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 安装程序包存在问题,并且作为安装的一部分运行的程序未完成。然后它回滚我的主应用程序安装并且永远不会安装。谁能解释为什么会发生这种情况以及如何解决?谢谢!

【问题讨论】:

  • 仅供参考,只要目标系统也安装了 Universal CRT,在安装程序中添加 Microsoft_VC140_CRT_x64.msm 工作。合并模块本身不再完全独立。
  • 这个问题你解决了吗?我和你的情况一样。我有自己的 EULA,我需要添加 c++ redist。 2017 到我的设置文件,但所有答案都是旧的并且使用 .msm 文件,我对这个 WiX 设置进度真的很陌生,所以 .msm 文件可能工作但我不知道如何使用它们..

标签: wix visual-studio-2015 vcredist


【解决方案1】:

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

您的其他选项似乎是像上面 Patrick Allwood 建议的那样创建引导程序,或者只是要求用户在运行您自己的安装程序之前自行安装 vc_redist 软件包。您可以通过检查ucrtbase.dll 中的C:\Windows\System32 来检测通用C 运行时是否已经存在:

<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 版报告给其他工具。如果您只想检查ucrtbase.dll 是否存在,可以删除MinVersion 属性。

【讨论】:

  • 我无法让它与 MinVersion 一起使用?! (我的 ucrtbase.dll 上有“10.0.10586.0”)有什么想法吗?
  • MinVersion 检查失败! win32api.GetFileVersionInfo('ucrtbase.dll', '\\') 为我的 Windows 10 机器上的文件版本返回 2.6.10586.0sigcheck.exe 返回10.0.10586.0。很奇怪。更糟糕的是,msiexec /i /log*xv 没有记录任何有用的信息。我删除了MinVersion,它起作用了。
  • 仅供参考:找到 ucrtbase.dll 将确认已安装“通用 CRT”。 UCRT 是 MSVC 2015 可再发行组件的要求,如果缺少它们,vc_redist.exe 将导致它们被安装。但是,UCRT 是通过 Windows 更新交付的,因此很可能在不安装 MSVC 2015 可再发行组件的情况下安装 ucrtbase.dll。 tl;dr:不要使用 ucrtbase.dll 的存在来决定是否启动 vc_redist.exe。
【解决方案2】:

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

可以看到一个准系统示例here,您可以按照需要安装的顺序在Chain 元素中添加&lt;MsiPackage&gt;&lt;ExePackage&gt;

【讨论】:

  • 我有点希望我可以在不使用引导程序的情况下逃脱。但是,这可能是不可能的。主要原因是我已经有一个自定义的 .msi 文件,它会自动在不同的文化中显示我的 EULA。我不确定是否可以使用引导应用程序省略许可证文件,并使用它一次性安装 .msi 和 vcredist_x64.exe。但是,我想我需要做更多的挖掘工作。如果您有任何其他可能更“优雅”或“msi 友好”的方式来做到这一点,请告诉我。
  • 另外,有谁知道为什么我当前的实现(使用自定义操作来启动 .exe 文件)失败了?似乎它应该工作。是不是因为 vcredist_x64.exe 有一个安装复选框,要求您同意他们的条款和条件。这会导致我的安装程序失败吗?
  • 您可以让引导程序在运行时显示您的 MSI 安装程序界面,我认为您也可以将引导程序设置为没有 ui。
  • 关于您的第二条评论 - 从带有日志记录的命令行运行您的 msi,检查日志文件。读起来很乱,但你可以全面了解发生了什么。
【解决方案3】:

我遇到了类似的问题(在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" />

【讨论】:

    猜你喜欢
    • 2016-05-11
    • 2013-08-31
    • 1970-01-01
    • 1970-01-01
    • 2014-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-12
    相关资源
    最近更新 更多