Как проверить, установлен ли на устройстве распространяемый пакет microsoft visual c++ 2015

Как видно из названия, в настоящее время я не могу найти ответов на эту проблему.

В настоящее время я использую C# для проверки.

В основном ответы относятся к версии 2013 года и ниже.

Если у вас есть предложения, поделитесь.

Спасибо.

У вас есть требование к одному файлу или вы бы подумали о сборке смешанного режима C++ / CLI? Если вы можете загрузить сборку, redist есть. Если это вызывает исключение, вам что-то не хватает.

Ben Voigt 26.10.2018 04:13

Просто никогда не делай этого. Это задача установщика vcredist. Он вам все равно понадобится, когда вы обнаружите, что его нет, поэтому просто всегда запускайте его.

Hans Passant 26.10.2018 04:18

Если вы посмотрите любую игру в Steam, вы найдете папку «_CommonRedist», содержащую установщики VC Redist (2010) и DX 9 June 2010. И они старательно выполняются при первом запуске программы. Делайте то же, что и все: всегда имейте настройки и всегда запускайте их как часть установщика с правами администратора. И если это не удастся, вы все равно ничего не сможете с этим поделать :)

Christopher 26.10.2018 04:24

Попробуйте такой ответ: stackoverflow.com/a/51211615/533242. Однако лучший способ - просто запустить установщик в автоматическом режиме. Если компьютеру он не нужен, он не будет установлен.

ub3rst4r 26.10.2018 04:38
5
4
6 128
4

Ответы 4

Основной ответ: не беспокойтесь, если он присутствует во время выполнения. Поместите его в свой установщик. Пусть это будет выполнено как часть обычного процесса установки «Требуются повышенные права».

Если он уже был там, установщик просто ничего не сделает.

Если его там не было, он теперь будет работать с правами администратора и после этого будет там.

Если он был поврежден, надеюсь, установщик исправит установку.

Если это почему-то не сработало, ваш ничтожный пользовательский код ничего не может сделать, чтобы исправить это во время выполнения. Это работа администраторов.

Это делает каждый установщик, в том числе Visual Studio и SQL Server. Единственная небольшая модификация, о которой я знаю, - это Steam, который запускает эти установщики с повышенными правами перед первым запуском программы. Но это просто «удостовериться, что это есть» под немного другим углом.

Я знаю только один тип программистов, который этого не делает: тот, кто никогда не тестировал свою программу на только что установленной Windows (виртуальные машины работают) и, следовательно, не знает требований даже существуют (потому что каждая другая программа устанавливает VC Redist и текущие версии DX ).

Как упоминалось в комментариях и ответе, один из способов - запустить установщик и посмотреть, установлена ​​ли более новая версия. Программа установки выдаст сообщение об ошибке и завершит работу. Если установщик запущен с флагом /quiet, то ошибка не отображается. Другой способ - просто проверить значения реестра:

HKEY_LOCAL_MACHINE\SOFTWARE[\Wow6432Node]\Microsoft\VisualStudio\vs-version\VC\Runtimes\{x86|x64|ARM} key

Здесь vs-version - это версия Visual Studio (14.0 для Visual Studio 2015 и 2017). Ключ - ARM, x86 или x64 в зависимости от платформы.

Номер версии хранится в строковом значении REG_SZВерсия. Если устанавливаемый пакет меньше версии установленного, то устанавливать не нужно.

Подробнее здесь: https://docs.microsoft.com/en-us/cpp/ide/redistributing-visual-cpp-files?view=vs-2017

Трудно получить все значения реестра для VC 2015, поэтому я написал небольшую функцию, которая будет проходить через все зависимости и соответствовать указанной версии (C++ 2015 x86)

public static bool IsVC2015x86Installed()
{
    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\+\+ 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\)")

Редактировать для C++ 2017 сделал мой день. !!! Спасибо

Sagar Patel 01.10.2021 12:10

Я модифицировал версию @ssamko, чтобы проверить наличие распространяемых файлов x64 и x86. Надеюсь, это поможет кому-то:

public static bool IsVC2015Installed()
{
    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 (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;

Я не уверен, что это хорошее дополнение. Потому что вы можете установить только C++ 2015 x86 на машину x64 без проблем для запуска определенных приложений (которые не запускаются с использованием C++ 2015 x64). Если вы все равно хотите просто проверить обе версии, я бы слил эти регулярные выражения с: C\+\+ 2015.*\((x64|x86)\)

ssamko 23.06.2020 12:46

Спасибо за этот комментарий, я применил это дополнение к своему ответу

Phyti1 24.06.2020 10:23

Другие вопросы по теме