【问题标题】:Detect if Visual C++ Redistributable for Visual Studio 2012 is installed检测是否安装了 Visual C++ Redistributable for Visual Studio 2012
【发布时间】:2012-08-25 17:43:29
【问题描述】:

如何检测是否安装了 Visual C++ Redistributable for Visual Studio 2012?

我用谷歌搜索了一下,居然没人问过这个问题,太惊喜了!

【问题讨论】:

  • 为什么不通过在 C++ 中设置运行时库来删除这种依赖关系> 代码生成为多线程 [debug] 而不是多线程 [debug] dll?我刚刚通过简单地删除依赖解决了运行时 redist 安装的问题。
  • 我发现了如何通过反复试验来检测包。我希望有一颗神奇的子弹,但如果有的话,我还没有找到。我在下面得到了一些特定的 redist 的答案,这些 redist 似乎 100% 的时间都在帮助目前他们中的大多数。
  • 请考虑将接受的答案更改为 kayleeFrye_onDeck 的答案。我花了很长时间寻找一种可靠的方法,这似乎是一个,我认为与所有其他不可靠的答案一起,它将帮助很多人找到正确的信息
  • Visual Studio 2017 运行时似乎有更新:14.10.V25017。链接:go.microsoft.com/fwlink/?LinkId=746572能否更新注册表值?

标签: visual-c++


【解决方案1】:

这取决于您使用的版本。这两个 2012 密钥对我来说效果很好,它们对应的版本可以下载更新 4。请注意,其中一些 reg 位置可能与操作系统有关。我从 Windows 10 x64 框中收集了这些信息。我将继续转储所有这些 redist 版本和我搜索以检测安装的 reg 密钥。:


Visual C++ 2005

Microsoft Visual C++ 2005 Redistributable (x64)
Registry Key: HKLM\SOFTWARE\Classes\Installer\Products\1af2a8da7e60d0b429d7e6453b3d0182
Configuration: x64
Version: 6.0.2900.2180

直接下载网址:https://download.microsoft.com/download/8/B/4/8B42259F-5D70-43F4-AC2E-4B208FD8D66A/vcredist_x64.EXE

Microsoft Visual C++ 2005 Redistributable (x86)
Registry Key: HKLM\SOFTWARE\Classes\Installer\Products\c1c4f01781cc94c4c8fb1542c0981a2a 
Configuration: x86
Version: 6.0.2900.2180

直接下载网址:https://download.microsoft.com/download/8/B/4/8B42259F-5D70-43F4-AC2E-4B208FD8D66A/vcredist_x86.EXE


Visual C++ 2008

Microsoft Visual C++ 2008 Redistributable - x64 9.0.30729.6161 (SP1)
Registry Key: HKLM\SOFTWARE\Classes\Installer\Products\67D6ECF5CD5FBA732B8B22BAC8DE1B4D 
Configuration: x64
Version: 9.0.30729.6161 (Actual $Version data in registry: 0x9007809 [DWORD])

直接下载网址:https://download.microsoft.com/download/2/d/6/2d61c766-107b-409d-8fba-c39e61ca08e8/vcredist_x64.exe

Microsoft Visual C++ 2008 Redistributable - x86 9.0.30729.6161 (SP1)
Registry Key: HKLM\SOFTWARE\Classes\Installer\Products\6E815EB96CCE9A53884E7857C57002F0
Configuration: x86
Version: 9.0.30729.6161 (Actual $Version data in registry: 0x9007809 [DWORD])

直接下载地址:https://download.microsoft.com/download/d/d/9/dd9a82d0-52ef-40db-8dab-795376989c03/vcredist_x86.exe


Visual C++ 2010

Microsoft Visual C++ 2010 Redistributable (x64)
Registry Key: HKLM\SOFTWARE\Classes\Installer\Products\1926E8D15D0BCE53481466615F760A7F 
Configuration: x64
Version: 10.0.40219.325

直接下载网址:https://download.microsoft.com/download/1/6/5/165255E7-1014-4D0A-B094-B6A430A6BFFC/vcredist_x64.exe

Microsoft Visual C++ 2010 Redistributable (x86)
Registry Key: HKLM\SOFTWARE\Classes\Installer\Products\1D5E3C0FEDA1E123187686FED06E995A 
Configuration: x86
Version: 10.0.40219.325

直接下载网址:https://download.microsoft.com/download/1/6/5/165255E7-1014-4D0A-B094-B6A430A6BFFC/vcredist_x86.exe


Visual C++ 2012

Microsoft Visual C++ 2012 Redistributable (x64)
Registry Key: HKLM\SOFTWARE\Classes\Installer\Dependencies\{ca67548a-5ebe-413a-b50c-4b9ceb6d66c6} 
Configuration: x64
Version: 11.0.61030.0

直接下载网址:https://download.microsoft.com/download/1/6/B/16B06F60-3B20-4FF2-B699-5E9B7962F9AE/VSU_4/vcredist_x64.exe

Microsoft Visual C++ 2012 Redistributable (x86)
Registry Key: HKLM\SOFTWARE\Classes\Installer\Dependencies\{33d1fd90-4274-48a1-9bc1-97e33d9c2d6f} 
Configuration: x86
Version: 11.0.61030.0

直接下载地址:https://download.microsoft.com/download/1/6/B/16B06F60-3B20-4FF2-B699-5E9B7962F9AE/VSU_4/vcredist_x86.exe

版本警告:每个用户 Wai Ha Lee 的发现,“...VC++ 2012 更新 4 (11.0.61030.0) 附带的二进制文件11.0.60610.1 用于 ATL 和 MFC 二进制文件,11.0.51106.1 用于其他所有文件,例如 msvcp110.dll 和 msvcr110.dll..."

附加警告 -- 2012 年更新 4:每位用户 Krptodr VC++ 2012 Update 4 (x86) 在 GUID {95716cce-fc71-413f-8ad5-56c2892d4b3a} 下显示

VC++ 2012 Update 4 (x64) 在 GUID {a1909659-0a08-4554-8af1-2175904903a1} 下显示

^^ 提供的 GUID 用于安装程序包。但是,这些分支分为各自的拱形类型的另外两个 GUID。更多信息请查看以下来源How to check if the Microsoft Visual C++ Runtime is installed


Visual C++ 2013

Microsoft Visual C++ 2013 Redistributable (x64)
Registry Key: HKLM\SOFTWARE\Classes\Installer\Dependencies\{050d4fc8-5d48-4b8f-8972-47c82c46020f} 
Configuration: x64
Version: 12.0.30501.0

直接下载网址:https://download.microsoft.com/download/2/E/6/2E61CFA4-993B-4DD4-91DA-3737CD5CD6E3/vcredist_x64.exe

Microsoft Visual C++ 2013 Redistributable (x86)
Registry Key: HKLM\SOFTWARE\Classes\Installer\Dependencies\{f65db027-aff3-4070-886a-0d87064aabb1} 
Configuration: x86
Version: 12.0.30501.0

直接下载地址:https://download.microsoft.com/download/2/E/6/2E61CFA4-993B-4DD4-91DA-3737CD5CD6E3/vcredist_x86.exe


Visual C++ 2015

考虑使用 2015-2019 捆绑包作为替代方案

Microsoft Visual C++ 2015 Redistributable (x64) - 14.0.24215
Registry Key: HKLM\SOFTWARE\Classes\Installer\Dependencies\{d992c12e-cab2-426f-bde3-fb8c53950b0d}
Configuration: x64
Version: 14.0.24215.1

直接下载网址:https://download.microsoft.com/download/6/A/A/6AA4EDFF-645B-48C5-81CC-ED5963AEAD48/vc_redist.x64.exe

Microsoft Visual C++ 2015 Redistributable (x86) - 14.0.24215
Registry Key: HKLM\SOFTWARE\Classes\Installer\Dependencies\{e2803110-78b3-4664-a479-3611a381656a}
Configuration: x86
Version: 14.0.24215.1

直接下载网址:https://download.microsoft.com/download/6/A/A/6AA4EDFF-645B-48C5-81CC-ED5963AEAD48/vc_redist.x86.exe


Visual C++ 2017

考虑使用 2015-2019 捆绑包作为替代方案

警告:要么正在使用新的 2017 年注册表约定,要么尚未最终确定。正如我猜测的最上面的键: [HKEY_CLASSES_ROOT\Installer\Dependencies\,,amd64,14.0,bundle][HKEY_CLASSES_ROOT\Installer\Dependencies\,,x86,14.0,bundle]

可能会发生变化,或者至少有不同的嵌套 GUID,我将使用列出以 GUID 结尾的键。

Microsoft Visual C++ 2017 Redistributable (x64) - 14.16.27012
Registry Key: [HKEY_CLASSES_ROOT\Installer\Dependencies\VC,redist.x64,amd64,14.16,bundle\Dependents\{427ada59-85e7-4bc8-b8d5-ebf59db60423}]
Configuration: x64
Version: 14.16.27012.6

直接下载网址:https://download.visualstudio.microsoft.com/download/pr/9fbed7c7-7012-4cc0-a0a3-a541f51981b5/e7eec15278b4473e26d7e32cef53a34c/vc_redist.x64.exe

Microsoft Visual C++ 2017 Redistributable (x86) - 14.16.27012
Registry Key: [HKEY_CLASSES_ROOT\Installer\Dependencies\VC,redist.x86,x86,14.16,bundle\Dependents\{67f67547-9693-4937-aa13-56e296bd40f6}]
Configuration: x86
Version: 14.16.27012.6

直接下载地址:https://download.visualstudio.microsoft.com/download/pr/d0b808a8-aa78-4250-8e54-49b8c23f7328/9c5e6532055786367ee61aafb3313c95/vc_redist.x86.exe


Visual C++ 2019(2015-2019 捆绑包

警告:Visual C++ 2019 使用了另一个新的注册表约定。Visual C++ 2019 似乎也没有独立安装程序,只有 Visual C++ 2015 到这个捆绑安装程序2019.

14.21.27702

Microsoft Visual C++ 2015-2019 Redistributable (x64) - 14.21.27702
Registry Key: [HKEY_CLASSES_ROOT\Installer\Dependencies\VC,redist.x64,amd64,14.21,bundle\Dependents\{f4220b74-9edd-4ded-bc8b-0342c1e164d8}]
Configuration: x64
Version: 14.21.27702  

直接下载网址:https://download.visualstudio.microsoft.com/download/pr/9e04d214-5a9d-4515-9960-3d71398d98c3/1e1e62ab57bbb4bf5199e8ce88f040be/vc_redist.x64.exe

Microsoft Visual C++ 2015-2019 Redistributable (x86) - 14.21.27702
Registry Key: [HKEY_CLASSES_ROOT\Installer\Dependencies\VC,redist.x86,x86,14.21,bundle\Dependents\{49697869-be8e-427d-81a0-c334d1d14950}]
Configuration: x86
Version: 14.21.27702

直接下载网址:https://download.visualstudio.microsoft.com/download/pr/c8edbb87-c7ec-4500-a461-71e8912d25e9/99ba493d660597490cbb8b3211d2cae4/vc_redist.x86.exe

14.22.27821

Microsoft Visual C++ 2015-2019 Redistributable (x86) - 14.22.27821
Registry Key: [HKEY_CLASSES_ROOT\Installer\Dependencies\VC,redist.x86,x86,14.22,bundle\Dependents\{5bfc1380-fd35-4b85-9715-7351535d077e}]
Configuration: x86
Version: 14.22.27821

直接下载网址: https://download.visualstudio.microsoft.com/download/pr/0c1cfec3-e028-4996-8bb7-0c751ba41e32/1abed1573f36075bfdfc538a2af00d37/vc_redist.x86.exe

Microsoft Visual C++ 2015-2019 Redistributable (x86) - 14.22.27821
Registry Key: [HKEY_CLASSES_ROOT\Installer\Dependencies\VC,redist.x64,amd64,14.22,bundle\Dependents\{6361b579-2795-4886-b2a8-53d5239b6452}]
Configuration: x64
Version: 14.22.27821

直接下载网址: https://download.visualstudio.microsoft.com/download/pr/cc0046d4-e7b4-45a1-bd46-b1c079191224/9c4042a4c2e6d1f661f4c58cf4d129e9/vc_redist.x64.exe


更新日志
2021 年 10 月 26 日——更新以进一步阐明 10 月 21 日的调查结果。
2021 年 10 月 21 日 -- 根据 Krptodr 的调查结果,为 VC++2012 Update 4 (x86) 和 (x64) GUID 添加了额外的警告细节。
2019 年 8 月 19 日 -- 添加了 2015-2019 捆绑版本的新版本
2019 年 6 月 13 日 -- 为 2015-2019 捆绑版本 14.21.27702 添加了一个新部分,并在 2015 和 2017 部分添加了关于考虑使用新捆绑包作为替代方案。
2018 年 12 月 14 日 -- 根据 Jim Wolff 的调查结果,更新了 Service Pack 1 的 9.0.30729.6161 的 MSVC2008
2018 年 11 月 27 日 -- MSVC2017 v. 14.16 的更新信息
2018 年 9 月 12 日 -- 根据 Wai Ha Lee 的调查结果,为 2012 更新 4 添加了版本警告
2018 年 8 月 24 日 -- 更新 2017 年版本 14.15.26706,更新了与 VS 2017 15.8.1 打包的 Visual C++ 依赖项
2018 年 5 月 16 日 -- 将 14.14.26405.0 的 2017 版本更新为新的 C++ 2017 条目
2017 年 9 月 8 日 -- 将 14.11.25325.0 的 2017 版本更新为新的 Visual C++ 2017 条目
2017 年 4 月 7 日 -- 将 2017 版 14.10.25008.0 更新为新的 Visual C++ 2017 条目
2016 年 10 月 24 日 -- 更新了 14.0.24215.1 的 2015 年版本信息
2016 年 8 月 18 日 -- 更新了 14.0.24212 的 2015 年版本信息
2016 年 5 月 27 日 -- MSVC2015 更新 2 的更新信息

如果其中任何内容过时,请在此处与我联系。

【讨论】:

  • 这是完美的。这是我发现的唯一一个在安装 Visual Studio 或卸载运行时时不会给出误报的方法。
  • VS2015 Pre Update 1 的 GUID 是 {74d0e5db-b326-4dae-a6b2-445b9de1836e},因此您可以使用此机制进入泡菜。对于未来的每一次更新!在安装了 Update 1 的情况下启动 Pre Update 1 VCRedist 给了我一个错误 - 所以我将使用 VC 安装程序 reg 密钥 - 如果你使用 VCRedist 似乎没问题?
  • 不幸的是,这不包含 VCREDIST 14.0 Update 2 -- 我们如何处理前向兼容性(检测相同运行时的更新、后续版本)
  • @ManjunathBabu,我认为没有关于 Visual C++ 可再发行安装程序的注册表约定的任何外部文档。我只是注意到,他们似乎在 2017 年这一次实际上遵循了类似于计划的东西,而不是仅仅在没有有意义的父键名称的情况下将另一个 GUID 扔到某个地方。到目前为止,他们已将这些位置用于 2017 年所有已发布的安装程序:[HKEY_CLASSES_ROOT\Installer\Dependencies\,,x86,14.0,bundle\Dependents\{$GUID}[HKEY_CLASSES_ROOT\Installer\Dependencies\,,amd64,14.0,bundle\Dependents\{$GUID}
  • Visual C++ 2017新包更改注册表路径(版本14.16.27012.6)[HKEY_CLASSES_ROOT\Installer\Dependencies\VC,redist.x86,x86,14.16,bundle] [HKEY_CLASSES_ROOT\Installer\Dependencies\VC,redist.x64,amd64,14.16,bundle]
【解决方案2】:

试试

HKLM\SOFTWARE\Microsoft\DevDiv\VC\Servicing\11.0

作为起点。我将使用它作为安装 VC++ 11 (VS 2012) 运行时的检查。

【讨论】:

  • HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\DevDiv\vc\Servicing\11.0\RuntimeMinimum\Install 应设置为 1
  • 对于 32 位(又名 x86),密钥位于:HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\DevDiv\VC\Servicing\11.0\RuntimeMinimum
  • @kayleeFrye_onDeck 你找到怎么做了吗?我也在寻找一种可靠的方法,但是这个页面上的答案都没有对我有用
  • 比公认的更好的答案,因为它不依赖包 UUID,可能会随着微软提供的每个补丁而改变
【解决方案3】:

您可以在此注册表位置检查Installed 的值是否为1:64 位系统上的HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\11.0\VC\Runtimes\x86。在会导致访问注册表项HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\11.0\VC\Runtimes\x86 的代码中。注意Wow6432Node 的缺失。

在 32 位系统上,没有 Wow6432Node 时注册表相同:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\11.0\VC\Runtimes\x86

【讨论】:

  • 我有一台安装了 2012 VC++ 运行时的 32 位 Win7 机器,但我没有这个 reg 密钥。
  • 你确定你没有`HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\11.0\VC`吗?你有什么?
  • 我有HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\11.0\VC,但我没有Runtimes 密钥。我确实有戴夫回答HKLM\SOFTWARE\Microsoft\DevDiv\VC\Servicing\11.0的钥匙。
  • @BryanJ 奇怪的是每个系统都可以如此不同......感谢您添加这些有用的信息
  • 有趣的故事,没有来自 MS 的真实信息。我想你有我迄今为止发现的最好的答案。测试在相对的新 VM 上安装 vcredist,这是我之后发现的唯一密钥。所以从我这边竖起大拇指...
【解决方案4】:

Visual C++ 附带的引导程序包清单中没有 installcheck 元素。如果您将其设置为先决条件,我猜微软希望始终安装它。

当然你仍然可以调用MsiQueryProductState来检查是否通过MSI安装了VC redist包,可以通过运行找到包代码

wmic product get

在命令行,或者如果你已经在 wmic:root\cli,运行

product where "Caption like '%C++ 2012%'"

【讨论】:

    【解决方案5】:

    不幸的是,这个简单问题的答案并不简单,而是在 100% 的所有系统中工作,甚至可以扩展到众多 .net 框架。

    复杂性来自这样一个事实,即存在(并且曾经)许多 VC 运行时修订版,这可能导致尽管安装了 VC10 运行时,但它们的内部版本号不够新,因此您的 EXE 不会启动,除非您安装了您需要的非常精确的运行时或较新的运行时之一,它使同一主要版本的此版本和以前的版本能够与它一起运行(并排地狱)。 此外,如果您有 64 位 EXE,则必须同时检查 32 位和 64 位运行时。

    也就是说,确定您的 EXE 的运行时是否已安装的唯一可靠方法是尝试运行该 EXE - 或者使用与您的主 EXE 相同的设置构建的另一个 EXE其唯一目的是做——什么也不做。只是运行(这意味着运行时已安装)或运行失败(未安装时)。

    我为需要安装 VC10 32 位和 64 位运行时的安装程序执行了以下操作:安装程序尝试启动所有虚拟 EXE,如果成功,则认为已安装相应的运行时。这也解决了 32/64 位场景。

    顺便说一句,这也可以确定是否安装了正确的 .net 框架,这在 Windows 8 和 10 中非常棘手,因为可下载的内置 .net 3.5 支持也支持 .net 3.0 和2.0 - 这些没有注册表项。 (更糟糕的是,您甚至不能在这里使用标准框架安装程序,您必须使用内置支持并通过 Windows 下载它,或者使用 .net 4 重新构建您的应用程序,但那是另一回事了)。

    可以使用具有以下代码的项目构建 C++ 虚拟 EXE(如果需要,还可以使用另一个 64 位配置):

    int _tmain(int argc, _TCHAR* argv[])
    {
        return 0;
    }
    

    记得将项目的属性使用MFC设置为在共享DLL中使用MFC。 可执行文件的大小约为 4KB - 只需付出很小的代价即可获得可靠的结果。

    为了给您的用户带来良好的安装体验,您可以执行以下操作(示例代码适用于 NSIS):

    Function TryLaunchApplication
      Pop $1 ; pathname
      nsExec::Exec $1
      Pop $0
    
      ${If} $0 == "error"
      ${OrIf} $0 != 0
        Push 0
      ${Else}
        Push 1
      ${EndIf}
    FunctionEnd
    

    并在函数中调用它,例如检查运行时间

    Function CheckRuntimes
      ; Try to execute VC++ 10 application (32 bit)
      Push "Vc10RuntimeCheckerApp.exe"
      Call TryLaunchApplication
      Pop $Vc10RuntimesFound
    
      ; Add 64 bit check if required.
      ; Remember to try running the 64 bit EXE only on a 64 bit OS,
      ; which requires further checks.
    
      ; Try to execute .net application
      Push "DotNetRuntimeCheckerApp.exe"
      Call TryLaunchApplication
      Pop $DotNetFrameworkFound
    FunctionEnd
    

    然后启动运行时检查,例如当离开Welcome页面并缓存结果时,您不必每次用户点击“返回”和“下一步”按钮时都重新检查。

    接下来,在安装树中创建一个只读部分,并在显示组件页面之前执行的函数上预先选择或取消选择它。

    这将确保每个缺少的运行时组件的安装都是强制性的,如果它已经存在则跳过。

    【讨论】:

    • 感谢您提供的有用提示,您还记得必须创建什么类型的项目吗? VS 有很多可供选择:-)。
    【解决方案6】:

    由于 Visual Studio 2010 及更高版本停止使用 WinSxS,只需检查 %windir%\system32\msvcr110.dll 可能就足够了。如果要验证是否有足够新的版本,可以检查文件版本是 11.0.50727.1 (VS2012 RTM) 还是 11.0.51106.1 (VS2012 Update 1)。

    【讨论】:

    • +1 这更简单,更简单。注册表项都很好,但是如果用户弄乱了系统并删除了 msvcr110.dll,则注册表检查是无用的。最好检查您需要的所有组件(msvcr110.dll、msvcp110.dll、mfc、...)。对于更新 3,版本为 11.0.60610.1。
    • ok 忽略最后一点:似乎只有安装程序是 11.0.60610.1,crt dll 的版本仍然是 11.0.51106.1
    • ya .dll 是 11.0.51106.1,即使我安装了 vs2012 sp4
    • 这行不通。我卸载了 2005-2015,我仍然有 60、100、110、120 和 140 的 msvc 文件。
    • 请注意,VC++ 2012 更新 4 (11.0.61030.0) 附带的二进制文件的版本为 11.0.60610.1,用于 ATL 和 MFC 二进制文件,11.0.51106.1 用于其他所有文件,例如msvcp110.dll 和 msvcr110.dll。不知道为什么。您可以通过转到 C:\ProgramData\Package Cache\{BD95A8CD-1D9F-35AD-981A-3E7925026EBB}v11.0.61030\packages\vcRuntimeMinimum_x86C:\ProgramData\Package Cache\{B175520C-86A2-35A7-8619-86DC379688B9}v11.0.61030\packages\vcRuntimeAdditional_x86 然后检查 .cab 文件中的文件来确认这一点(在我测试过的 Windows 10 机器上)。
    【解决方案7】:

    我在检查 Visual C++ 可再发行组件(作为 WiX 创建的 MSI 安装程序的一部分)的上下文中寻找答案时遇到了这个问题。

    我不喜欢 GUID 如何随版本和操作系统而变化,因此我最终创建了一个用 C# 编写的自定义操作来检查 Visual C++ 可再发行组件。

    以下所有内容都专门针对 Visual C++ 2015 Redistributable (x64),但可以轻松修改为任何版本。

    using Microsoft.Deployment.WindowsInstaller;
    using Microsoft.Win32;
    
    namespace CustomActions
    {
        public class DependencyChecks
        {
            [CustomAction]
            public static ActionResult IsVC2015RedistInstalled(Session session)
            {
                session.Log("Begin Visual C++ 2015 Redistributable installation check.");
    
                var dependenciesKey = Registry.LocalMachine.OpenSubKey("SOFTWARE\\Classes\\Installer\\Dependencies");
    
                foreach(var subKey in dependenciesKey.GetSubKeyNames())
                {
                    var dependency = dependenciesKey.OpenSubKey(subKey);
                    var displayName = (string)dependency.GetValue("DisplayName");
                    if(displayName != null)
                    {
                        if (displayName.Contains("Microsoft Visual C++ 2015 Redistributable (x64)"))
                        {
                            session.Log("Visual C++ 2015 Redistributable is installed.");
                            return ActionResult.Success;
                        }
                    }
                }
    
                session.Log("Visual C++ 2015 Redistributable is not installed.");
                session.Message(InstallMessage.Error, new Record(1, "This application requires Visual C++ 2015 Redistributable. Please install, then run this installer again. https://www.microsoft.com/en-us/download/details.aspx?id=53587"));
                return ActionResult.Failure;
            }
        }
    }
    

    然后在wxs文件中

    <Binary Id='VC2015RedistCheck' SourceFile='!(wix.ResourcesDir=resources)\CustomActions.CA.dll'/>
        <CustomAction
          Id='VC2015RedistCheckAction'
          Execute='immediate'
          BinaryKey='VC2015RedistCheck'
          DllEntry="IsVC2015RedistInstalled"
          Return='check'/>
    
    <InstallExecuteSequence>
      <Custom Action='VC2015RedistCheckAction' After='InstallInitialize'/>
    </InstallExecuteSequence>
    

    编辑 我正在使用有关创建和使用自定义操作的一些基本信息来更新此答案。

    为了在安装了 WiX Toolset Visual Studio 2017 扩展的 Visual Studio 2017 中创建自定义操作,我使用项目模板创建了一个自定义操作(C# Custom Action Project for WiX v3)。

    我检查了生成的项目,它似乎已经在本文开头列出了更改:https://www.codeproject.com/Articles/132918/Creating-Custom-Action-for-WIX-Written-in-Managed 所以我在Adding Custom Action to the Installer 部分选择了那篇文章,并对其进行了一些调整。

    我做的另一件事是将构建项目的 .NET 框架版本更改为 3.5。

    我觉得它不是很有用,但你也可以看到http://wixtoolset.org/documentation/manual/v3/wixdev/extensions/authoring_custom_actions.html

    【讨论】:

      【解决方案8】:

      对我来说,这个位置很有效: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\DevDiv\vc\Servicing\11.0\RuntimeMinimum\Version

      在安装软件包后检查您拥有的版本,并将其用作安装程序中的条件。 (安装 VCred 后我的设置为 11.0.50727)。

      【讨论】:

      • 这个答案正是我们正在寻找的(与这里的其他答案相比,不幸的是,这些答案更少关于运行时,更多关于 Visual Studio。)
      • 这个答案不起作用,因为这个密钥在你卸载了 redist 之后才存在。
      【解决方案9】:

      只需转到“控制面板”>“程序和功能”,它们都会出现在那里。

      我不是专家,与人们的回答(检查注册表)相比,这个答案非常简单,所以我不确定它是否是正确的答案,但它对我有用。

      【讨论】:

        【解决方案10】:
        if RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\10.0\VC\VCRedist\x86","Installed") = 0 Then
          if RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\11.0\VC\Runtimes\x86","Installed") = 0 Then
        

        【讨论】:

          【解决方案11】:

          我已经使用 InnoSetup 成功地做到了这一点。

          我检查了注册表项的存在:

          HKLM\SOFTWARE\Microsoft\VisualStudio\11.0\VC\Runtimes

          如果卸载,则不存在。如果已安装,则存在。

          顺便说一句,它也可以在 Wow6432Node 中:

          HKLM\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\11.0\VC\Runtimes

          【讨论】:

          • 这是不真实的。卸载后,这两个位置都存在密钥。
          • @kayleeFrye_onDeck 是的......我必须同意你的看法。但事实上,当我第一次尝试时,它是成功的。但最近就像你说的那样。我不知道为什么会这样。
          【解决方案12】:

          通过MsiQueryProductState 检查产品的安装状态几乎等同于直接检查注册表,但您仍然需要ProductCode 的GUID。

          如其他地方所述,这些方法的一个缺点是每次更新都有自己的 ProductCode!

          值得庆幸的是,MSI 提供了一个UpgradeCode,用于标识一个“系列”产品。您可以使用 orca 打开其中一个 MSI 以提取此信息。例如,VS2015 的可再发行组件的 UpgradeCode 是 {65E5BD06-6392-3027-8C26-853107D3CF1A}

          您可以使用MsiEnumRelatedProducts 获取该UpgradeCode 的所有产品ID。实际上,由于每个 redist 更新都会替换前一个,因此这只会产生一个 ProductCode - 例如 VS2015 Update 2 x86 的 {B5FC62F5-A367-37A5-9FD2-A6E137C0096F}

          无论如何,您可以通过MsiGetProductInfo(productCode, INSTALLPROPERTY_VERSIONSTRING, ...) 或类似功能检查版本以与您想要的版本进行比较,例如检查等效或更高版本。

          请注意,在 C++ 应用程序中,您还可以使用 _VC_CRT_MAJOR_VERSION_VC_CRT_MINOR_VERSION_VC_CRT_BUILD_VERSION(如果您使用 #include &lt;crtversion.h&gt;)——这样您可以确定计算构建二进制文件时使用的 CRT 版本。

          【讨论】:

          • 您是如何获得这些信息的?那是x86版本还是x64版本的UpgradeCode?​​span>
          • 您可以使用 Orca 打开 msi 并提取 UpgradeCode。这里给出的至少是针对 x86 的。至于我从哪里获得其余信息,这几乎是主要来源;我在网上找不到其他关于这种方法的参考资料,特别是关于 redist,但 UpgradeCode / family 模式在 MSI 安装程序中很常见。
          • 我知道 Orca。问题与进入那个 MSI 有关。我不知道直接访问它的方法。我知道的唯一方法是以某种方式在 c:\Windows\Installer 目录中找到它。我在该目录中有超过 1,000 个文件。这些文件是随机命名的。确定哪个 MSI 正确的唯一方法是查看描述。这包括在资源管理器中对 1,000 个文件按 Alt+Enter 或使用工具转储 1,000 个文件的描述。
          • 啊,我明白了。如果您知道产品代码,也可以在 HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UpgradeCodes 中搜索注册表以查找路径甚至升级代码。但是,您可能需要使用 WMIC(或其他一些对 msi db 的编程访问)来找出其余部分。 wmic product get /format:csv 将转储一个您可以搜索的 csv - 它在返回值中有 msi 路径。我相信你可以写一个更好的脚本,但这应该足以让你上路了。
          【解决方案13】:

          这个 PowerShell 代码应该可以解决问题

          Get-ItemProperty
          HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* | 
          Select-Object DisplayName, DisplayVersion, Publisher, InstallDate |
          Format-Table –AutoSize
          

          【讨论】:

          • 因为硬编码一堆产品代码是行不通的,所以我们也枚举了注册表,用正则表达式检查每个条目的“产品名称”,然后我们检查 VersionMajor/VersionMinor(这就是我们的全部真的很关心)这具有允许我们生成单个构建并知道它将在给定 vcredist 版本的使用寿命内继续工作的价值。这里的意图很明确,但可能需要对 NSIS 或基于 WinAPI 的安装程序等工具集进行音译。
          【解决方案14】:

          我需要同样的东西,虽然 AFAIK 这不能以编程方式完成,但它对我有用。

          我刚刚转到开始 --> 卸载程序,然后向下滚动,直到找到包含版本号的 VC++ 可再发行组件。谷歌搜索版本号,告诉我它属于 VS2012 SP1。

          【讨论】:

            【解决方案15】:

            老问题,但这是我们自 Visual Studio 2005 以来成功使用的方法。我刚刚也使用 Visual Studio 2012 Update 4 对其进行了测试(因为我们最终将软件从 2010 年更新到 2012 年)。

            由于 Visual C++ Redistributable 软件包在 windows 中注册了它们的卸载程序(因此它显示在控制面板的“程序和功能”列表中),我们只需检查注册表中卸载程序键的显示名称。

            这里是相关的 NSIS 代码:

            ReadRegStr $0 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{33d1fd90-4274-48a1-9bc1-97e33d9c2d6f}\" "DisplayName"
            StrCmp $0 "Microsoft Visual C++ 2012 Redistributable (x86) - 11.0.61030" vs2012redistInstalled
            DetailPrint "Microsoft Visual C++ 2012 Update 4 Redistributable not found!"
            DetailPrint "Downloading from www.mywebsite.com"
            ; insert applicable download code here
            ExecWait '"<downloaded redist exe>" /promptrestart /passive'
            vs2012redistInstalled:
            

            请注意,由于我们的安装程序是 32 位 exe,Windows 会处理确定注册表项是否实际上位于虚拟化 Wow6432Node 而不是上述位置,因此上述代码适用于 64 位和 32 位 Windows 安装,而无需显式检查这两个键.

            另请注意,要将上述代码更新为不同版本的 VC++ Redist,只需将注册表项路径中的 GUID 和显示名称更改为您需要的任何内容。

            虽然这可能不是推荐的方法,但在过去 10 年中,它已经在 10,000 多台机器上运行,运行从 XP/XP64 到 Windows 10 的各种 Windows 版本,使用 2005、2010、2010sp1 和现在的 2012u4。

            【讨论】:

              【解决方案16】:

              我会检查 Installed 的值

              HKLM\SOFTWARE\[WOW6432Node]\Microsoft\Windows\CurrentVersion\Uninstall\{VCRedist_GUID}

              • VC++ 2012 (x86) 的 GUID 是 {33d1fd90-4274-48a1-9bc1-97e33d9c2d6f}
              • WOW6432Node 是否存在取决于VC++ redist 产品

              【讨论】:

                【解决方案17】:

                大多数人错过的是在 Windows x64 上检查密钥所需的 /reg:32

                请参阅 Microsoft Help article 了解此主题。

                这是一个演示如何正确检查 Visual C++ Redistributable for Visual Studio 2012 Update 4 的脚本。

                @ECHO OFF
                
                :Author
                REM "CREATED BY WAR59312"
                REM "FEB 7th 2017"
                
                REM Clear Screen
                CLS
                
                TITLE Detect Visual C++ 2012 Redistributables
                
                REM This Batch Script Detects If Visual C++ Redistributable for Visual Studio 2012 Update 4 Is Installed
                
                :DetectWindowsOS
                REM Are We Running On x86 Or x64
                IF NOT DEFINED PROCESSOR_ARCHITEW6432 (
                IF %PROCESSOR_ARCHITECTURE% EQU x86 (
                REM Windows Is x86
                GoTo Check32Bit
                ) ELSE (
                REM Windows Is x64
                SET NeededFor64BitOnly=/reg:32
                GoTo Check64Bit
                )) ELSE (
                REM Windows Is Unknown But Assume x64 To Be Safe
                SET NeededFor64BitOnly=/reg:32
                GoTo Check64Bit
                )
                
                :Check64Bit
                REM Checks If Visual C++ 64Bit Redistributable for Visual Studio 2012 Update 4 Is Installed
                REG QUERY "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\11.0\VC\Runtimes\x64" /v "Version" %NeededFor64BitOnly% 2>NUL^ | (
                  FIND "v11.0.61030.00" >NUL
                ) && (
                  ECHO.
                  ECHO 64bit Visual C++ Redistributable for Visual Studio 2012 Update 4 Is Installed
                  ECHO.
                  GoTo Check32Bit
                ) || (
                   ECHO.
                   ECHO 64bit Visual C++ Redistributable for Visual Studio 2012 Update 4 Is NOT Installed
                   ECHO.
                   GoTo Check32Bit
                )
                
                :Check32Bit
                REM Checks If Visual C++ 32Bit Redistributable for Visual Studio 2012 Update 4 Is Installed
                REG QUERY "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\11.0\VC\Runtimes\x86" /v "Version" %NeededFor64BitOnly% 2>NUL^ | (
                  FIND "v11.0.61030.00" >NUL
                ) && (
                   ECHO.
                   ECHO 32bit Visual C++ Redistributable for Visual Studio 2012 Update 4 Is Installed
                ) || (
                   ECHO.
                   ECHO 32bit Visual C++ Redistributable for Visual Studio 2012 Update 4 Is NOT Installed
                )
                
                :END
                ECHO.
                PAUSE
                
                EXIT
                

                【讨论】:

                  【解决方案18】:

                  powershell脚本解决方案:

                  根据@kayleeFrye_onDeck 的回答中的信息

                  我已经创建了一个 powershell 脚本来检查和安装用户指定的版本,我没有用它进行过广泛的测试,但是对于我自己的 CI(持续集成)场景它可以完美地工作。

                  github上的完整脚本和信息

                  我使用的方法是根据此处提供的信息检查 regkeys。以下是该脚本的要点:

                  function Test-RegistryValue {
                  param (
                   [parameter(Mandatory=$true)]
                   [ValidateNotNullOrEmpty()]$Path,
                   [parameter(Mandatory=$true)]
                   [ValidateNotNullOrEmpty()]$Value
                  )
                      try {
                      Get-ItemProperty -Path "$($Path+$Value)" -ErrorAction Stop | Out-Null
                          return $true
                      }
                      catch {
                          return $false
                      }
                  }
                  

                  基于$redistInfo的检查/下载/静默安装,其中包含来自kayleeFrye_onDeck的编译信息。

                  $redistInstalled = Test-RegistryValue -Path $redistInfo.RegPath -Value $redistInfo.RegValue
                  if($redistInstalled -eq $False) {
                      Invoke-WebRequest -Uri $redistInfo.DownloadUrl -OutFile $downloadTargetPath
                      Start-Process -FilePath $downloadTargetPath -ArgumentList "$($redistInfo.SilentInstallArgs)" -Wait -NoNewWindow | Wait-Process
                  }
                  

                  完整的脚本和更多信息可以在github找到

                  欢迎任何人贡献,如果我有时间,我将对脚本进行更广泛的测试,并在此处添加信息时继续尝试添加新包。

                  【讨论】:

                    【解决方案19】:

                    很难获得 VC 2012 的所有注册表值,所以我编写了一个小函数,它将遍历所有依赖项并匹配指定版本。

                    public static bool IsVC2012Installed()
                    {
                        string dependenciesPath = @"SOFTWARE\Classes\Installer\Dependencies";
                    
                        using (RegistryKey dependencies = Registry.LocalMachine.OpenSubKey(dependenciesPath))
                        {
                            if (dependencies == null) return false;
                    
                            foreach (string subKeyName in dependencies.GetSubKeyNames().Where(n => !n.ToLower().Contains("dotnet") && !n.ToLower().Contains("microsoft")))
                            {
                                using (RegistryKey subDir = Registry.LocalMachine.OpenSubKey(dependenciesPath + "\\" + subKeyName))
                                {
                                    var value = subDir.GetValue("DisplayName")?.ToString() ?? null;
                                    if (string.IsNullOrEmpty(value)) continue;
                    
                                    if (Regex.IsMatch(value, @"C\+\+ 2012")) //here u can specify your version.
                                    {
                                        return true;
                                    }
                                }
                            }
                        }
                    
                        return false;
                    }
                    

                    依赖关系:

                    using System.Text.RegularExpressions;
                    using Microsoft.Win32;
                    using System.Linq;
                    

                    【讨论】:

                      【解决方案20】:

                      我在 Server 2019 和 Windows 10 中为 PowerShell 使用这一衬里。我不知道 这是多么向后兼容。

                      Get-CimInstance -Class Win32_Product -Filter "Name LIKE '%Visual C++ %Redistri%'" | Select Name, Caption, Version
                      

                      【讨论】:

                        【解决方案21】:

                        您可以在注册表中搜索。实际上我没有vs2012但我有vs2010。

                        3 个平台包中的每一个都有 3 个不同(但非常相似)的注册表项。每个键都有一个名为“Installed”的 DWORD 值,值为 1。

                        • HKLM\SOFTWARE\Microsoft\VisualStudio\10.0\VC\VCRedist\x86

                        • HKLM\SOFTWARE\Microsoft\VisualStudio\10.0\VC\VCRedist\x64

                        • HKLM\SOFTWARE\Microsoft\VisualStudio\10.0\VC\VCRedist\ia64

                        您可以使用注册表功能......

                        【讨论】:

                        • 我在第一行写了“我没有 VS2012”。所以不需要评论这个............而且这只适用于vs2010
                        • 您确实注意到了这一点,但似乎您建议您的解决方案也适用于 VS2012,因为那是 OP 的问题(但无法验证,因为您没有 VS2012) .我只是说这种方法实际上不适用于 VS2012,因为我检查过它。
                        • 为什么对我的答案投反对票......我已经写清楚它是针对 vs2012 的......并且这被用户接受为答案......那么为什么???? ??????
                        • 似乎对于 x64 位操作系统,此值位于 HKLM\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\10.0\VC\VCRedist\...
                        • VS 2012 的键是 HKLM\SOFTWARE\Microsoft\VisualStudio\11.0\VC\RunTimes____ HKLM\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\11.0\VC\RunTimes___
                        猜你喜欢
                        • 1970-01-01
                        • 1970-01-01
                        • 2023-03-22
                        • 1970-01-01
                        • 1970-01-01
                        • 2014-08-22
                        • 1970-01-01
                        • 1970-01-01
                        相关资源
                        最近更新 更多