我有一个在VS2015中编译的应用程序,需要VC++ Redistributable包才能正常运行。在此最新版本之前,我们使用的是旧版本的VS,并简单地使用合并模块来处理适当redist文件的安装。但是,我注意到在使用2015年的合并模块(Microsoft_VC140_CRT_x64.msm)的最新版本时,我的应用程序仍然无法开箱即用。I did some digging,似乎在最新版本的合并模块中发生了一些变化。微软现在似乎建议直接安装vcredist_x64.exe包,而不是使用合并模块。
因此,我正在尝试创建一个自定义操作来完成此操作。我遵循的是一个similar tutorial here,不过将它改编成适用于VC可再发行的可执行文件。我需要做的第一件事是设置在安装后放置.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软件包存在问题,并且作为安装程序的一部分运行的程序未完成。然后,它会回滚我的主应用程序安装,并且永远不会安装。有谁能解释为什么会发生这种情况,以及如何修复它?谢谢!
发布于 2016-02-10 22:32:28
在同样的情况下,我发现了这个问题,并亲自尝试。我发现您遇到的安装程序错误was/is错误1618:“另一个安装已经在进行中。”在你自己的安装程序中运行vc_redist安装程序似乎是行不通的。
您的其他选择似乎是像Patrick Allwood上面建议的那样创建引导程序,或者简单地要求用户在运行自己的安装程序之前自行安装vc_redist包。您可以通过检查C:\Windows\System32中的ucrtbase.dll来检测通用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属性。
发布于 2016-01-16 01:15:16
我认为,当有自己的安装程序的先决条件时,应该采取的正确方法是创建一个WiX引导程序包,它依次运行于每个安装程序中。它可以处理安装失败时的回滚等事情,而从安装程序中运行自定义操作则不能。
可以看到一个简单的示例,您可以按照需要安装<MsiPackage>和<ExePackage>的顺序在Chain元素中添加它们。
发布于 2020-09-18 21:29:52
我正面临着类似的问题(在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" />https://stackoverflow.com/questions/34815579
复制相似问题