如何检查设备上Microsoft是否安装了 Visual C++ 2015 可再发行组件



正如标题所说,我目前找不到这个问题的任何答案。

我目前正在使用 C# 进行检查。

大多数答案是针对 2013 及以下版本。

如果你们有任何建议,请分享。

谢谢。

基本答案是:如果它在运行时存在,请不要打扰。将其放入安装程序中。让它作为正常的"需要提升的权限"安装过程的一部分执行。

如果它已经存在,安装程序将不执行任何操作。

如果它不存在,它现在将在管理员权限下运行,然后在那里。

如果它已损坏,希望安装程序能够修复安装。

如果这以某种方式不起作用,那么您的微不足道的用户代码无法在运行时修复它。这是管理员的工作。

每个安装程序都这样做,其中最重要的是Visual Studio和SQL Server。我知道的唯一轻微修改是 Steam,它在程序首次执行之前以提升的权限运行这些安装程序。但这只是从一个稍微不同的角度"确保它在那里"。

我只知道一种程序员不这样做:他从未在新安装的Windows上测试过他的程序(虚拟机工作(,因此甚至不知道要求的存在(因为所有其他程序都安装VC Redist和当前的DX版本(。

很难获取VC 2015的所有注册表值,所以我编写了一个小函数,它将遍历所有依赖项并在指定版本(C++ 2015 x86(上匹配

public static bool IsVC2015x86Installed()
{
string dependenciesPath = @"SOFTWAREClassesInstallerDependencies";
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++ 2015.*(x86)")) //here u can specify your version.
{
return true;
}
}
}
}
return false;
}

依赖:

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

编辑:

C++ 2017 是 C++ 2015 的有效替代品,因此如果您想检查它,请像这样编辑正则表达式:

Regex.IsMatch(value, @"C++ (2015|2017).*(x86)")

如注释和回答中所述,一种方法是让安装程序运行并查看是否安装了更新的版本。安装程序将显示错误并退出。 如果使用/quiet标志运行安装程序,则不会显示任何错误。另一种方法是简单地检查注册表值:

HKEY_LOCAL_MACHINESOFTWARE[Wow6432Node]MicrosoftVisualStudiovs-versionVCRuntimes{x86|x64|ARM} key

这里vs-version是Visual Studio的版本(Visual Studio 2015和2017的14.0( 密钥是ARM,x86或x64,具体取决于平台。

版本号存储在REG_SZ字符串值"版本"中。如果正在安装的软件包低于已安装的版本,则无需安装。

更多信息在这里: https://learn.microsoft.com/en-us/cpp/ide/redistributing-visual-cpp-files?view=vs-2017

我修改了@ssamko的版本以检查x64和x86可再发行组件。希望它能帮助某人:

public static bool IsVC2015Installed()
{
string dependenciesPath = @"SOFTWAREClassesInstallerDependencies";
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 (Environment.Is64BitOperatingSystem)
{
if (Regex.IsMatch(value, @"C++ 2015.*((x64|x86))"))
{
return true;
}
}
else
{
if (Regex.IsMatch(value, @"C++ 2015.*(x86)"))
{
return true;
}
}
}
}
}
return false;
}

依赖:

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

最新更新