检测是否安装了Visual Studio 2012的Visual C ++可再发行组件


109

如何检测是否已安装Visual Studio 2012的Visual C ++可再发行组件?

我尝试了Google,但没人问这个问题,很惊讶!


1
为什么不通过在C ++>代码生成中将运行时库设置为多线程[debug]而不是多线程[debug] dll来消除该依赖关系?我只是通过删除依赖关系解决了运行时Redist安装的问题。
Cem Kalyoncu 2015年

我发现了如何通过反复试验来检测软件包。我希望有一个神奇的子弹,但如果有,我还没有找到。下面是一些特定的Redist的答案,这些Redist似乎在100%的时间内可以为当前大多数人提供帮助。
kayleeFrye_onDeck

3
请考虑通过kayleeFrye_onDeck将接受的答案更改为该答案。我花了很长时间寻找一种可靠的方法,这似乎是一种方法,我认为与其他所有不可靠的答案一样,它将帮助很多人找到正确的信息
musefan

Visual Studio 2017运行时似乎已更新:14.10.V25017。链接:go.microsoft.com/fwlink/ ? LinkId=746572您可以更新注册表值吗?
karel vergauwe

Answers:


172

这取决于您使用的版本。这两个2012年密钥对于我来说很不错,可以下载更新4的相应版本。请注意,其中某些注册位置可能取决于操作系统。我从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

直接下载URL: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

直接下载URL: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])

直接下载URL: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])

直接下载URL: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

直接下载URL: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

直接下载URL: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

直接下载URL: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

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

版本警告:根据用户 Wai Wai Lee的发现,“ ... VC ++ 2012 Update 4(11.0.61030.0)附带的二进制文件具有11.0.60610.1ATL和MFC二进制文件以及11.0.51106.1其他所有版本的版本,例如msvcp110.dll和msvcr110.dll。 ..”


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

直接下载URL: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

直接下载URL: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

直接下载URL: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

直接下载URL: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

直接下载URL: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

直接下载URL: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  

直接下载URL: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

直接下载URL: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

直接下载URL: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

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


更新日志
2019年8月19日-增加了2015至2019年软件包版本的新版本,
2019年6月13日-增加了对2015年至2019年包版本一个新的部分14.21.27702,并添加小票到2015年和2017年部分有关考虑使用新捆绑包作为替代。
2018年12月14日- 9.0.30729.6161根据Jim Wolff的调查结果更新了Service Pack 1的MSVC2008 更新
2018年11月27日-2018年14.16
9月12日更新了MSVC2017 v。的信息-
8月24日根据Wai Wai Lee的调查结果向2012 Update 4添加了警告说明, 2018年-更新了2017年版本的14.15.26706,这是与VS 2017 15.8.1一起打包的更新后的Visual C ++依赖项
2018年5月16日-更新了2017版本的14.14.26405.0作为新的C ++ 2017条目
2017年9月8日-更新了2017版本的14.11.25325.0作为新的Visual C ++ 2017条目
2017年4月7日-更新了2017版本的14.10 .25008.0作为新的Visual C ++ 2017条目
于2016年10月24日发布-更新了2015年版本信息14.4.24215.1
2016年8月18日-更新了2015年版本信息14.4.24212
2016年5月27日-更新了MSVC2015 Update 2信息

如果其中任何一个过时,请在这里与我联系。


4
太棒了。这是我发现的唯一在安装Visual Studio或卸载运行时时不会产生误报的工具。
AN

2
VS2015 Pre Update 1的GUID为{74d0e5db-b326-4dae-a6b2-445b9de1836e},因此您可以使用此机制来腌制。对于以后的每一次更新!启动安装了Update 1的Update 1之前的VCRedist会给我一个错误-所以我将使用VC安装程序的注册表项-如果您使用VCRedist,这似乎还可以吗?
GilesDMiddleton '16

4
不幸的是,它不包含VCREDIST 14.0 Update 2 –我们如何处理前向兼容性(检测同一运行时的更新,成功版本)
Shaun Wilson

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}
kayleeFrye_onDeck

2
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]
live2

31

尝试

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

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


7
HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ DevDiv \ vc \ Servicing \ 11.0 \ RuntimeMinimum \ Install应该设置为1
Alex Spence

3
对于32位(aka x86),密钥位于:HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\DevDiv\VC\Servicing\11.0\RuntimeMinimum
CodeFox 2014年

@kayleeFrye_onDeck您找到了怎么做的吗?我仍在寻找一种可靠的方法,但是此页面上的答案都没有对我
AN

答案比公认的更好,因为它不依赖于软件包UUID,对于Microsoft提供的每个补丁,它都可能会有所变化
jpo38 '18

25

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

在32位系统上,注册表相同,但没有Wow6432NodeHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\11.0\VC\Runtimes\x86


我有一台安装了2012 VC ++运行时的32位Win7计算机,但没有此注册表项。
BryanJ 2013年

您确定没有`HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ VisualStudio \ 11.0 \ VC`吗?你有什么?
Mike de Klerk

2
我有HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\11.0\VC但我没有Runtimes钥匙。戴夫的答案中确实有钥匙HKLM\SOFTWARE\Microsoft\DevDiv\VC\Servicing\11.0
BryanJ 2013年

@BryanJ很奇怪,每个系统都可以如此不同...感谢您添加此有用的信息
Mike de Klerk 2013年

3
有趣的故事,没有来自MS的真实信息。我认为到目前为止,您已经找到了最好的答案。经过测试,将vcredist安装在relativley新VM上,这是我后来发现的唯一关键。所以从我这边竖起大拇指...
anhoppe 2014年

12

Visual C ++附带的引导程序包清单中没有installcheck元素。如果您将其设置为前提条件,则猜想Microsoft希望始终进行安装。

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

wmic product get

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

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

10

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

复杂性来自以下事实:存在(并且曾经有)许多VC运行时修订版,这可能导致以下情况:尽管安装了VC10运行时,但其内部版本号不够新,因此除非您安装了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

并在一个函数中调用它,例如CheckRuntimes

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

然后启动运行时检查,例如在离开欢迎时页面时并缓存结果,因此您不必每次用户单击“上一步”和“下一步”按钮时都重新检查。

接下来,在安装树中创建一个只读部分,并在组件之前执行的功能上对其进行预选择或取消选择页面。

这将确保必须安装每个缺少的运行时组件,如果已经存在,则将跳过安装。


感谢您的有用提示,您还记得必须创建哪种类型的项目吗?VS有很多可供选择的:-)。
greenoldman '16

9

由于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。
stijn

好的,忽略最后一点:似乎只有安装程序是11.0.60610.1,ctr dll的版本仍然是11.0.51106.1
stijn 2013年

ya .dll是11.0.51106.1,即使我安装了vs2012 sp4
Blub 2015年

这行不通。我卸载了2005-2015,但仍然有60、100、110、120和140的msvc文件。
kayleeFrye_onDeck

请注意,VC ++ 2012 Update 4(11.0.61030.0)附带的二进制文件具有11.0.60610.1ATL和MFC二进制文件以及11.0.51106.1其他所有版本的版本,例如msvcp110.dll和msvcr110.dll。不知道为什么。您可以证实这一点(在我测试过它在Windows 10的机器)由去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文件中的文件。
Wai Ha Lee

5

我遇到了这个问题,它在检查作为WiX创建的MSI安装程序一部分的Visual C ++可重新分发的上下文中寻找答案。

我不喜欢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中创建自定义动作,我使用了项目模板来创建自定义动作(用于WiX v3的C#自定义动作项目)。

我检查了生成的项目,它似乎已经在本文开头列出了更改: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


4

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

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


这个答案正是我们正在寻找的(不幸的是,这里的其他答案相对于其他答案,这些答案很少涉及运行时,而更多地涉及Visual Studio。)
Shaun Wilson

该答案不起作用,因为在卸载重做器之后,该密钥存在。
kayleeFrye_onDeck

4

只需转到“控制面板”>“程序和功能”,它们就会在此处列出。

我不是专家,与人们正在回答的内容(检查注册表)相比,这个答案非常简单,因此我不确定这是否是正确的答案,但它确实帮了我大忙。

程序和特点


3
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

3

我已经用InnoSetup成功做到了。

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

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

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

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

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


这是不正确的。密钥在卸载后在两个位置都存在。
kayleeFrye_onDeck

1
@kayleeFrye_onDeck是的...我必须同意你的观点。但是实际上,当我第一次尝试时,它是成功的。但是最近就像你说的那样。我不知道为什么会这样。
Fandi Susanto

3

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

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

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

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

无论如何,您都可以通过MsiGetProductInfo(productCode,INSTALLPROPERTY_VERSIONSTRING等)来检查版本,以与所需版本进行比较,例如检查等效或更高版本。

需要注意的是一个C ++应用程序中,你也可以使用_VC_CRT_MAJOR_VERSION_VC_CRT_MINOR_VERSION_VC_CRT_BUILD_VERSION如果你#include <crtversion.h>-这样就可以判断计算的CRT版本的二进制与建造。


您是如何获得此信息的?那是x86版本还是x64版本的UpgradeCode?
本基

您可以使用Orca打开msi并提取UpgradeCode。这里给出的至少是针对x86的。至于我从哪里获得其余信息,这几乎是主要来源。我在网上找不到有关该Redist的其他参考,但是UpgradeCode /系列模式在MSI安装程序中很常见。
adzm

我知道Orca。问题与进入该MSI有关。我不知道直接访问它的方法。我知道的唯一方法是以某种方式在c:\ Windows \ Installer目录中找到它。该目录中有1000多个文件。这些文件是随机命名的。确定哪个MSI正确的唯一方法是查看说明。这涉及在资源管理器中对1,000个文件按Alt + Enter或使用工具转储1,000个文件的描述。
本基

啊,我明白了。如果您知道产品代码,也可以在HKLM \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Installer \ UpgradeCodes中搜索注册表,以找到路径甚至升级代码。但是,您可能需要使用WMIC(或其他对msi db的编程访问)来找出其余的内容。Wmic产品get / format:csv将转储您可以搜索的csv-它在返回值中包含msi路径。我敢肯定,您可以编写一个更好的脚本,但这足以让您上路。
adzm

3

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

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

因为不会对大量产品代码进行硬编码,所以我们也枚举注册表使用正则表达式检查每个条目的“产品名称”,然后检查VersionMajor / VersionMinor(这是我们真正关心的),它具有以下值允许我们生成一个单独的版本,并知道它将在给定的vcredist版本的使用寿命内继续工作。这里的意图很明确,但可能需要对NSIS或基于WinAPI的安装程序之类的工具集进行音译。
肖恩·威尔逊

2

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

我只是去开始->卸载程序,然后向下滚动,直到找到包含版本号的VC ++可重新分发。谷歌搜索版本号,告诉我它属于VS2012 SP1。


2

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

由于Visual C ++可再发行组件包会在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台以上的计算机上运行,​​运行Windows XP / XP64到Windows 10的各种样式的窗口,并使用了2005、2010、2010sp1和现在的2012u4。


1

我会检查的Installed价值

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

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

0

大多数人想念的是/reg:32在Windows x64上检查密钥所必需的。

请参阅有关此主题的Microsoft帮助文章

以下脚本演示了如何正确检查Visual Studio 2012 Update 4的Visual C ++ Redistributable。

@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

0

Powershell脚本解决方案:

根据@kayleeFrye_onDeck答案中的信息

我已经创建了一个Powershell脚本来检查并安装用户指定的版本,但我并未对其进行广泛的测试,但是对于我自己的CI(连续集成)方案,它可以完美地工作。

完整的脚本和github上的信息

我使用的方法是基于根据此处提供的信息检查注册表项。以下是该脚本的主要作用:

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上找到

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


0

很难获得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;

-5

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

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

  • HKLM \软件\ Microsoft \ VisualStudio \ 10.0 \ VC \ VCRedist \ x86

  • HKLM \软件\ Microsoft \ VisualStudio \ 10.0 \ VC \ VCRedist \ x64

  • HKLM \软件\ Microsoft \ VisualStudio \ 10.0 \ VC \ VCRedist \ ia64

您可以为此使用注册表功能……


1
我在第一行“我没有VS2012”中写道。因此,没有必要对此发表评论........这仅适用于vs2010
vikky 2013年

1
您确实注意到了这一点,但是似乎您在暗示您的解决方案也适用于VS2012,因为这是OP的问题(但是由于您没有VS2012而无法验证)。我只是说这种方法实际上不适用于VS2012,因为我已将其签出。
StellarEleven

为什么不赞成我的答案......我已经清楚地写出它是针对vs2012的,而且这被用户接受为答案...
vikky

1
看来,对于x64位操作系统,此值位于HKLM\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\10.0\VC\VCRedist\...
bas

1
VS 2012键是HKLM \ SOFTWARE \ Microsoft \ VisualStudio \ 11.0 \ VC \ RunTimes ____ HKLM \ SOFTWARE \ Wow6432Node \ Microsoft \ VisualStudio \ 11.0 \ VC \ RunTimes ___
Adam L
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.