Определить, установлен ли распространяемый компонент Visual C ++ для Visual Studio 2012


109

Как определить, установлен ли распространяемый пакет Visual C ++ для Visual Studio 2012?

Я попробовал Google, и никто не задавал этот вопрос, сюрприз!


1
Почему бы не удалить эту зависимость, установив для библиотеки времени выполнения в C ++> Генерация кода значение Многопоточная [отладка] вместо Многопоточной [отладки] dll? Я только что решил проблему с установкой redist во время выполнения, просто удалив зависимость.
Cem Kalyoncu

Я узнал, как определять пакеты методом проб и ошибок. Я бы хотел, чтобы была волшебная пуля, но если она есть, я ее еще не нашел. У меня есть ответ вниз ниже для некоторых конкретных redists , которые , кажется, работают 100% от времени , чтобы помочь с в настоящее время большинство из них.
kayleeFrye_onДек

3
Пожалуйста, подумайте об изменении принятого ответа на ответ kayleeFrye_onDeck. Я потратил целую вечность в поисках надежного метода, и это, кажется, единственный, я думаю, со всеми другими ненадежными ответами он поможет многим людям найти нужную информацию
Musefan

Кажется, есть обновление для среды выполнения Visual Studio 2017: 14.10.V25017. Ссылка: go.microsoft.com/fwlink/?LinkId=746572 Не могли бы вы обновить значения реестра?
Карел Вергаув

Ответы:


172

Это зависит от того, какую версию вы используете. Эти два ключа 2012 года хорошо зарекомендовали себя с их соответствующими версиями, загружаемыми для обновления 4. Имейте в виду, что некоторые из этих расположений реестра могут зависеть от ОС. Я собрал эту информацию из окна Windows 10 x64 . Я просто собираюсь выгрузить все эти распространенные версии и ключи реестра, которые я ищу для обнаружения установки:


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

Предупреждение о версии : Согласновыводампользователя Вай Ха Ли , «... двоичные файлы, которые поставляются с VC ++ 2012 update 4 ( 11.0.61030.0), имеют версии 11.0.60610.1для двоичных файлов ATL и 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, я собираюсь использовать list ключ, заканчивающийся на 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


Журнал изменений :
19 августа 2019 г. - Добавлена ​​новая версия пакета 2015-2019 версии
13 июня 2019 г. - Добавлен новый раздел для версии пакета 2015-2019 гг. 14.21.27702И добавлены небольшие примечания к разделам 2015 и 2017 гг. О рассмотрении использования новый комплект в качестве альтернативы.
14 декабря 2018 г. - Обновлен MSVC2008 для обновления пакета обновления 1 в 9.0.30729.6161соответствии с выводами Джима Вольфа
27 ноября 2018 г. - обновлена ​​информация для MSVC2017 v. 14.16
12 сентября 2018 г. - добавлено предупреждение о версии для обновления 4 2012 г. по данным Вай Ха Ли
24 августа, 2018 - обновленная версия 2017 года для 14.15.26706, обновленные зависимости Visual C ++, упакованные с VS 2017 15.8.1
16 мая 2018 г. - обновленная версия 2017 г. для 14.14.26405.0 как новая запись C ++ 2017
8 сентября 2017 г. - обновленная версия 2017 г. для 14.11.25325.0 как новая запись Visual C ++ 2017
7 апреля 2017 г. - обновленная версия 2017 г. 14.10 .25008.0 в качестве новой записи Visual C ++ 2017
24 октября 2016 г. - обновлена ​​информация о версии 2015 г. для 14.0.24215.1
18 августа 2016 г. - обновлена ​​информация о версии 2015 г. для 14.0.24212
27 мая 2016 г. - обновлена ​​информация для MSVC2015 с обновлением 2

Пожалуйста, свяжитесь со мной здесь, если что-либо из этого устарело.


4
Это потрясающе. Это единственное, что я обнаружил, не дает ложных срабатываний при установке Visual Studio или удалении среды выполнения.
AN

2
GUID VS2015 до обновления 1 - {74d0e5db-b326-4dae-a6b2-445b9de1836e}, так что вы можете приступить к работе с этим механизмом. Для каждого будущего обновления! Запуск предварительного обновления 1 VCRedist с установленным обновлением 1 дал мне ошибку - поэтому я собираюсь использовать регистрационный ключ установщика VC - что, кажется, нормально, если вы используете VCRedist?
GilesDMiddleton,

4
к сожалению, это не содержит VCREDIST 14.0 Обновление 2 - как мы поступаем с прямой совместимостью (обнаружение более новых, последующих версий той же среды выполнения)
Шон Уилсон,

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-разрядной версии (также известной как x86) ключ находится по адресу:HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\DevDiv\VC\Servicing\11.0\RuntimeMinimum
CodeFox,

@kayleeFrye_onDeck вы узнали, как это сделать? Я все еще ищу надежный способ, но ни один из ответов на этой странице не помог мне
AN

Лучший ответ, чем принятый, поскольку он не зависит от UUID пакета, вероятно, будет меняться для каждого патча, предоставляемого Microsoft
jpo38

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-битной системе реестр такой же, без Wow6432Node:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\11.0\VC\Runtimes\x86


У меня 32-разрядная машина Win7 с установленной средой выполнения 2012 VC ++, и у меня нет этого ключа reg.
BryanJ

Вы уверены, что у вас нет `HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ VisualStudio \ 11.0 \ VC`? Что у тебя есть?
Майк де Клерк,

2
У меня есть, HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\11.0\VCно у меня нет Runtimesключа. У меня есть ключ в ответе Дэйва HKLM\SOFTWARE\Microsoft\DevDiv\VC\Servicing\11.0.
BryanJ

@BryanJ Странно, что каждая система может быть такой разной ... Спасибо за добавление этой полезной информации
Майк де Клерк,

3
Забавная история и никакой реальной информации от MS. Думаю, у вас есть лучший ответ, который я когда-либо видел. Протестировано для установки vcredist на релятивно свежую виртуальную машину, и это единственный ключ, который я нашел впоследствии. Так что палец вверх с моей стороны ...
анхопе

12

В манифесте пакета загрузчика, поставляемом с Visual C ++, нет элемента installcheck. Думаю, Microsoft хочет всегда устанавливать, если вы установите это в качестве предварительного условия.

Конечно, вы все равно можете вызвать MsiQueryProductState, чтобы проверить, установлен ли пакет VC redist через MSI. Код пакета можно найти, запустив

wmic product get

в командной строке или, если вы уже находитесь в wmic: root \ cli, запустите

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

10

Ответ на этот простой вопрос, к сожалению, непрост, но он работает в 100% всех систем и даже может быть расширен на множество фреймворков .net.

Сложность связана с тем фактом, что существует (и было) множество ревизий среды выполнения VC, которые могут привести к тому, что, хотя среды выполнения VC10 были установлены, их номер сборки был недостаточно свежим, поэтому ваш EXE не запускался, если вы не установили сам точное время выполнения, которое вам нужно, или одно из новых сред выполнения, которое позволяет этой и предыдущей версиям для одной и той же основной версии работать с ним (параллельный ад). Кроме того, если у вас 64-разрядный EXE, вам нужно будет проверить как 32-, так и 64-разрядную среду выполнения.

Тем не менее, единственный надежный способ определить, установлены ли среды выполнения для вашего EXE, - это попытаться запустить EXE - или другой EXE, созданный с теми же настройками, что и ваш основной EXE, и единственная цель которого - ничего не делать. Просто запустите (что означает, что среда выполнения установлена) или не запустится (если не установлена).

Я сделал следующее для установщика, который требовал установки 32- и 64-разрядной среды выполнения VC10: Программа установки пытается запустить все фиктивные EXE-файлы, и в случае успеха соответствующая среда выполнения считается установленной. Это также решает 32/64 битный сценарий.

Это, кстати, также помогает определить, установлена ​​ли надлежащая платформа .net, что очень сложно в Windows 8 и 10, поскольку загружаемая встроенная поддержка .net 3.5 также поддерживает версии .net 3.0 и 2.0 - там для них нет записей в реестре. (И что еще хуже, вы даже не можете использовать здесь стандартные установщики фреймворка, вы должны использовать встроенную поддержку и загрузить ее через Windows, или пересобрать свое приложение с помощью .net 4, но это уже другая история).

Пустой EXE-файл C ++ может быть создан с использованием проекта со следующим кодом (и еще одним в 64-битной конфигурации, если необходимо):

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

Не забудьте установить свойства проекта « Использование MFC» для использования MFC в общей DLL . Размер исполняемых файлов составит около 4 КБ - небольшая цена за гарантированный результат.

Чтобы пользователям было удобно при установке, вы можете сделать следующее (пример кода для 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

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, версия crt dll по-прежнему 11.0.51106.1
stijn

ya .dll - это 11.0.51106.1, хотя у меня установлен vs2012 sp4
Blub

Это не сработает. Я удалил 2005-2015, и у меня все еще есть файлы msvc для 60, 100, 110, 120 и 140.
kayleeFrye_on, декабрь

Обратите внимание, что двоичные файлы, которые поставляются с обновлением VC ++ 2012 update 4 ( 11.0.61030.0), имеют версии 11.0.60610.1для двоичных файлов ATL и 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_x86и C:\ProgramData\Package Cache\{B175520C-86A2-35A7-8619-86DC379688B9}v11.0.61030\packages\vcRuntimeAdditional_x86проверив файлы в файлах .cab.
Вай Ха Ли,

5

Я столкнулся с этим вопросом в поисках ответа в контексте проверки распространяемого пакета Visual C ++ как части установщика MSI, созданного WiX.

Мне не нравилось, как меняется 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>

Изменить Я обновляю этот ответ, добавляя некоторую базовую информацию о создании и использовании настраиваемого действия.

Чтобы создать настраиваемое действие в Visual Studio 2017 с установленным расширением WiX Toolset Visual Studio 2017, я использовал шаблон проекта для создания настраиваемого действия (C # Custom Action Project для WiX v3).

Я проверил сгенерированный проект, и, похоже, в нем уже есть изменения, перечисленные в начале этой статьи: https://www.codeproject.com/Articles/132918/Creating-Custom-Action-for-WIX-Written-in-Managed поэтому я взял эту статью в разделе Adding Custom Action to the Installerи дополнил ее некоторыми поправками.

Еще одна вещь, которую я сделал, - это изменила версию .NET framework, на которой построен проект, на 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

Проверьте, какая у вас версия после установки пакета, и используйте ее в качестве условия в установщике. (у меня установлено значение 11.0.50727 после установки VCred).


Этот ответ - именно то, что мы искали (по сравнению с другими ответами здесь, которые, к сожалению, не столько о времени выполнения, сколько о Visual Studio.)
Шон Уилсон

Этот ответ не работает, так как этот ключ существует после того, как вы удалили Redist.
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_on, декабрь

1
@kayleeFrye_onDeck Ага ... Я должен с тобой согласиться. Но на самом деле, когда я попробовал это впервые, все прошло успешно. Но недавно все было так, как вы сказали. Я не знаю, почему это так.
Fandi Susanto

3

Проверка состояния установки продукта через MsiQueryProductState в значительной степени эквивалентна проверке реестра напрямую, но вам все равно понадобится GUID для ProductCode .

Как упоминалось в другом месте, одним из недостатков этих подходов является то, что каждое обновление имеет свой собственный ProductCode!

К счастью, MSI предоставляет UpgradeCode, который определяет «семейство» продуктов. Вы можете использовать orca, чтобы открыть один из MSI для извлечения этой информации. Например, UpgradeCode для распространяемого пакета VS2015:{65E5BD06-6392-3027-8C26-853107D3CF1A}

Вы можете использовать MsiEnumRelatedProducts, чтобы получить все идентификаторы продуктов для этого UpgradeCode. На практике, поскольку каждое повторное обновление заменяет предыдущее, это дает только один 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 , что бинарный файл был построен с.


Как вы получили эту информацию? И это UpgradeCode для версии x86 или версии x64?
Бен Ки

Вы можете использовать Orca, чтобы открыть msi и извлечь UpgradeCode. Приведенный здесь, по крайней мере, для x86. Что касается того, откуда я получил остальную информацию, это в значительной степени основной источник; Я не смог найти других ссылок на этот подход в Интернете, в частности, о распространении, но шаблон UpgradeCode / family является общим для установщиков MSI.
adzm

Я знаю об Орке. Проблема связана с тем, чтобы добраться до этого MSI. Я не знаю, как получить к нему прямой доступ. Единственный известный мне способ - это как-то найти его в каталоге c: \ Windows \ Installer. У меня в этом каталоге более 1000 файлов. Файлы названы случайным образом. Единственный способ определить, какой MSI правильный, - это посмотреть на описание. Это включает в себя нажатие Alt + Enter на 1000 файлов в проводнике или использование инструмента для сброса описаний 1000 файлов.
Бен Ки,

АА, вижу. Вы также можете выполнить поиск в реестре, чтобы найти путь или даже код обновления, если вы знаете код продукта, в HKLM \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Installer \ UpgradeCodes. Однако вам может потребоваться использовать WMIC (или какой-либо другой программный доступ к базе данных msi), чтобы выяснить остальное. wmic product 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-битных окон без необходимости явно проверять оба ключа.

Также обратите внимание, что для обновления приведенного выше кода до другой версии VC ++ Redist просто измените GUID в пути к ключу реестра и отображаемое имя на все, что вам нужно.

Хотя это может быть не рекомендуемый метод, за последние 10 лет он работал на более чем 10 000 машинах, на которых были запущены все разновидности окон от XP / XP64 до Windows 10 с использованием повторных списков для 2005, 2010, 2010sp1, а теперь и 2012u4.


1

Я бы проверил Installedстоимость

HKLM\SOFTWARE\[WOW6432Node]\Microsoft\Windows\CurrentVersion\Uninstall\{VCRedist_GUID} ключ

  • где GUID из VC++ 2012 (x86)IS{33d1fd90-4274-48a1-9bc1-97e33d9c2d6f}
  • WOW6432Nodeбудет присутствовать или нет в зависимости от VC++ redistпродукта

0

Большинство людей упускают из виду необходимость /reg:32проверки ключа в Windows x64.

См. Статью справки Microsoft по этому вопросу.

Вот сценарий, демонстрирующий, как правильно проверить наличие распространяемого пакета Visual C ++ для Visual Studio 2012 с обновлением 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

0

Решение сценария 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's.

$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, называемое «Установлено», со значением 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

Для этого вы можете использовать функцию реестра ......


1
Я написал, что в первой строке «Что у меня нет VS2012». Так что не нужно это комментировать ............. И это было только для vs2010
vikky

1
Вы это заметили, но казалось, что вы предполагаете, что ваше решение может работать и для VS2012, поскольку это был вопрос OP (но не удалось проверить, поскольку у вас нет VS2012). Я просто сказал, что этот подход на самом деле не работает с VS2012, поскольку я его проверял.
StellarEleven

Почему проголосовали против моего ответа ...... Я ясно написал, что это для vs2012 ... и это принято как ответ пользователем .... так почему ???????????
vikky

1
Похоже, что с 64-битной ОС это значение находится по адресу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 ___
Адам L
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.