使用 VS2017 安装程序项目安装 vcredist_x64



我目前想为VS2017项目创建一个安装程序。该项目具有先决条件vcredist_x64。

要创建我已安装的安装程序: - ClickOnce Publishing(通过VS2017安装程序) - Microsoft Visual Studio 2017 Installer Projects(VS2017 Addon by Microsoft)

现在我创建了一个安装项目,并在属性 => 先决条件中选择了Visual C++ "14" Runtime Libraries (x64)Download prerequisites from the component vendor's web site

如果我现在开始创建安装程序.exe则在安装必备组件时在目标计算机上出现错误:The following packages could not be found:(没有列出单个软件包)。 日志文件:

已设置以下属性: 属性: [管理员用户] = 真 {布尔值} 属性: [安装模式] = 主站点 {字符串} 属性: [NTProductType] = 1 {int} 属性: [处理器体系结构] = AMD64 {字符串} 属性: [版本NT] = 10.0.0 {版本} 运行包"Visual C++ '14' 运行时库 (x64)"的检查,阶段 BuildList 运行 MsiProductCheck 的产品代码为"{C99E2ADC-0347-336E-A603-F1992B09D582}" MsiQueryProductState 返回 '-1' 为属性"VCRedistInstalled"设置值"-1 {int}" 已为包"Visual C++"14"运行时库 (x64)"设置了以下属性: 属性: [VCRedistInstalled] = -1 {int} 运行命令"vc_redist.x64.exe"的检查 在属性"VCRedistInstalled"和值"3"上运行运算符"ValueGreaterThanEqualTo"的结果:false 在属性"AdminUser"上运行运算符"ValueEqualTo"和值"false"的结果:false 在属性"处理器体系结构"和值"AMD64"上运行运算符"ValueNotEqualTo"的结果:false 在属性"VersionNT"和值"6.00"上运行运算符"版本小于"的结果:假 命令"vc_redist.x64.exe"的检查结果为"安装" "可视化C++"14"运行时库 (x64)"运行检查结果:需要安装 接受组件"Visual C++"14"运行时库 (x64)"的安装。 将文件复制到临时目录"C:\Users\blubb_user\AppData\Local\Temp\VSD1A14.tmp\" 错误:找不到以下软件包文件:

在VS 2015中,我遇到了同样的麻烦。修复了引导程序中的公钥。但是我找不到正确的公钥。我正在尝试使用匹配安装程序签名的公钥。在C:Program Files (x86)Microsoft SDKsClickOnce BootstrapperPackagesvcredist_x64product.xml中提到了 GUID,C99E2ADC-0347-336E-A603-F1992B09D582,所以我在C:ProgramDataPackage Cache中查找了使用此 GUID 的设置并采用了此公钥。

知道如何为VS2017修复它吗?

更新(解决方案):

我能够为我修复它(VS2017更新7): 在软件包中.xml VCRedistExe 的 (C:\Program Files (x86)\Microsoft SDK\ClickOnce Bootstrapper\Packages\vcredist_x64\en) 路径无效。 而不是

<String Name="VCRedistExe">https://aka.ms/vs/15/release/26405.00/VC_Redist.x64.exe</String>

我现在有

<String Name="VCRedistExe">https://aka.ms/vs/15/release/26429.04/VC_Redist.x64.exe</String>

C:\Program Files (x86)\Microsoft SDKs\ClickOnce Bootstrapper\Packages\vcredist_x64\product.xml我也变了

<Product xmlns="http://schemas.microsoft.com/developer/2004/01/bootstrapper" ProductCode="Microsoft.Visual.C++.14.0.x64">
<!-- Defines list of files to be copied on build -->
<PackageFiles CopyAllPackageFiles="false">
<PackageFile Name="vc_redist.x64.exe" HomeSite="VCRedistExe" PublicKey="3082010a0282010100a829fed410c8ff550a9e990003528fdcb0bff9abf851fe5c8c54c227ce4c2b96ebdb811ccb862b79ca757eb867832686bdd62f1c3ec758aa8f6f95fb5afca7c61bc1c3e84c174e223db75b565c7fd75af52dbabba609bf067cee98fe40f930b86bfe406f74b3b8d63849c9d087072f31dfb6bc4ea3d09eb7627b5670754f67bf05cca3aebe0092c21b50a1613b100001b186d029f340f50fd9a30f57ab6309a8dca96ae74743a7be15c43d27a4e8565288cf5999a10084369bd039d22a0d2fe604e2bf13968883a95137184189e2f9859d8e651a3d0364ccc5de50705df20b85a98fb145e877ff839d09bb72e0e6560895b92b83128931fce758721dbdf983230203010001" />
</PackageFiles>
<InstallChecks>
<MsiProductCheck Property="VCRedistInstalled" Product="{03EBF679-E886-38AD-8E70-28658449F7F9}"/>
</InstallChecks>
<!-- Defines how to invoke the setup for the Visual C++ 14.0 redist -->
<Commands Reboot="Defer">
<Command PackageFile="vc_redist.x64.exe" Arguments=' /q '>
<!-- These checks determine whether the package is to be installed -->
<InstallConditions>
<BypassIf Property="VCRedistInstalled" Compare="ValueGreaterThanOrEqualTo" Value="3"/>
<!-- Block install if user does not have admin privileges -->
<FailIf Property="AdminUser" Compare="ValueEqualTo" Value="false" String="AdminRequired"/>
<!-- Block install on any platform other than x64 -->
<FailIf Property="ProcessorArchitecture" Compare="ValueNotEqualTo" Value="AMD64" String="InvalidOS"/>
<!-- Block install on Vista or below -->
<FailIf Property="VersionNT" Compare="VersionLessThan" Value="6.00" String="InvalidPlatformWinNT"/>
</InstallConditions>
<ExitCodes>
<ExitCode Value="0" Result="Success"/>
<ExitCode Value="3010" Result="SuccessReboot"/>
<DefaultExitCode Result="Fail" FormatMessageFromSystem="true" String="GeneralFailure" />
</ExitCodes>
</Command>
</Commands>
</Product>

我不确定Product="{03EBF679-E886-38AD-8E70-28658449F7F9}",因为安装程序具有 GUID{80586c77-db42-44bb-bfc8-7aebbb220c00}(MsiProductCheck 不适用于它),所以我从 Visual C++ 2017 x64 最小运行时 - 14.14.26429 中获取Microsoft GUID。另一种可能性是从 Microsoft Visual C++ 2017 x64 附加运行时 - 14.14.26429 ({B12F584A-DE7A-3EE3-8EC4-8A64DBC0F2A7}) 中使用 GUID。最小和附加运行时将使用上面的脚本安装,因此我们采用哪个 GUID 应该无关紧要。

我在使用 x86 redist 时遇到了这个问题,最终能够将所有内容归咎于 MS 提供的vcredist_x86\product.xml文件。 您应该能够将相同的修补程序应用于vcredist_x64\product.xml文件。 出现此问题的原因是文件名和公钥与您从MS下载的实际编辑文件不匹配。

您必须将product.xml的"包文件\包文件"节点和"命令\命令"节点中的名称更改为vcredist_x64.exe,并将 redist 包从 MS 重命名为vcredist_x64.exe。 然后,更改"包文件">节点中的公钥属性,以匹配从 MS 获取的 EXE 的公钥。 您可以通过使用文件资源管理器查看 EXE 的 SHA1 证书(属性 -> 数字签名 (SHA1) -> 详细信息 -> 查看证书 -> 详细信息 -> 公钥)来获取此信息)

同样的问题。Microsoft的引导程序文件中有一个拼写错误。在C:Program Files (x86)Microsoft SDKsClickOnce BootstrapperPackagesvcredist_x86product.xml

vcredist_x86.exe替换为vc_redist.x86.exe并重新加载 Visual Studio。

对于 vs2015,vs2017,vs2019:我必须右键单击 VC_redist.x86.exe 文件上的选择属性,然后选择数字签名选项卡,如上所述选择sha256(不是 sha1),然后是详细信息按钮以获取证书属性窗口,然后是详细信息选项卡。 然后我不得不向下滚动到公钥。 从那里我必须从下面的 ASCII 转储窗口中选择并按 Ctrl+C 复制十六进制公钥文本,因为">复制到文件">按钮仅创建.cer文件。 然后我不得不在管理员模式下启动的Notepad++中编辑产品.xml文件,否则您将无法保存更新的文件。 将公钥文本粘贴到 product.xml 文件中后,我必须选择密钥的行并将分隔十六进制数字的所有空格替换为"。 然后我替换了公钥值并最终保存。 有没有人觉得奇怪,在 2020 年 vc_redist.*.exe 文件仍然没有反映在名称中版本,下载站点没有在文本中指示版本,没有指示公钥,因此知道它自您上次下载以来已更新的唯一方法是将文件大小与最新版本进行比较?

更新 2020-11-04:如上所述.xml从 https://support.microsoft.com/en-ca/help/2977003/the-latest-supported-visual-c-downloads 下载最新的 redist 并更新产品后,在使用更新的 msi 安装我的应用程序时,出现一条错误消息,指示"找不到以下软件包文件:vc_runtimeMinimum_x64.msi"。 在比较我今天下载的vc_redist exe和我一直使用的exe时,我注意到它更小。 看起来我可以回到旧版本。

最新更新