Как определить, установлен ли распространяемый пакет Visual C ++ для Visual Studio 2012?
Я попробовал Google, и никто не задавал этот вопрос, сюрприз!
Как определить, установлен ли распространяемый пакет Visual C ++ для Visual Studio 2012?
Я попробовал Google, и никто не задавал этот вопрос, сюрприз!
Ответы:
Это зависит от того, какую версию вы используете. Эти два ключа 2012 года хорошо зарекомендовали себя с их соответствующими версиями, загружаемыми для обновления 4. Имейте в виду, что некоторые из этих расположений реестра могут зависеть от ОС. Я собрал эту информацию из окна Windows 10 x64 . Я просто собираюсь выгрузить все эти распространенные версии и ключи реестра, которые я ищу для обнаружения установки:
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
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
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
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 . .. "
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
Рассмотрите возможность использования пакета 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
Рассмотрите возможность использования пакета 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 используется еще одно новое соглашение о реестре. Также, похоже, не существует автономного установщика для 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
Пожалуйста, свяжитесь со мной здесь, если что-либо из этого устарело.
[HKEY_CLASSES_ROOT\Installer\Dependencies\,,x86,14.0,bundle\Dependents\{$GUID}
и[HKEY_CLASSES_ROOT\Installer\Dependencies\,,amd64,14.0,bundle\Dependents\{$GUID}
[HKEY_CLASSES_ROOT\Installer\Dependencies\VC,redist.x86,x86,14.16,bundle] [HKEY_CLASSES_ROOT\Installer\Dependencies\VC,redist.x64,amd64,14.16,bundle]
Пытаться
HKLM\SOFTWARE\Microsoft\DevDiv\VC\Servicing\11.0
в качестве отправной точки. Я буду использовать это как проверку для установки среды выполнения VC ++ 11 (VS 2012).
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\DevDiv\VC\Servicing\11.0\RuntimeMinimum
Вы можете проверить, находится ли 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
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\11.0\VC
но у меня нет Runtimes
ключа. У меня есть ключ в ответе Дэйва HKLM\SOFTWARE\Microsoft\DevDiv\VC\Servicing\11.0
.
В манифесте пакета загрузчика, поставляемом с Visual C ++, нет элемента installcheck. Думаю, Microsoft хочет всегда устанавливать, если вы установите это в качестве предварительного условия.
Конечно, вы все равно можете вызвать MsiQueryProductState, чтобы проверить, установлен ли пакет VC redist через MSI. Код пакета можно найти, запустив
wmic product get
в командной строке или, если вы уже находитесь в wmic: root \ cli, запустите
product where "Caption like '%C++ 2012%'"
Ответ на этот простой вопрос, к сожалению, непрост, но он работает в 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
Затем запустите проверку времени выполнения, например, при выходе из страницы приветствия и кешируйте результат, чтобы вам не приходилось повторно проверять каждый раз, когда пользователь нажимает кнопки «Назад» и «Далее».
Затем создайте раздел в дереве установки, доступный только для чтения, и предварительно выберите или отмените его выбор в функции, которая выполняется до отображения страницы « Компоненты» .
Это гарантирует, что установка каждого отсутствующего компонента среды выполнения будет обязательной и будет пропущена, если она уже есть.
Поскольку Visual Studio 2010 и более поздние версии перестали использовать WinSxS, может быть достаточно просто проверить наличие% windir% \ system32 \ msvcr110.dll. Если вы хотите убедиться, что у вас достаточно новая версия, вы можете проверить, является ли версия файла 11.0.50727.1 (VS2012 RTM) или 11.0.51106.1 (VS2012 Update 1).
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.
Я столкнулся с этим вопросом в поисках ответа в контексте проверки распространяемого пакета 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
Для меня это место работало: HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ DevDiv \ vc \ Servicing \ 11.0 \ RuntimeMinimum \ Version
Проверьте, какая у вас версия после установки пакета, и используйте ее в качестве условия в установщике. (у меня установлено значение 11.0.50727 после установки VCred).
Просто зайдите в Панель управления> Программы и компоненты, и все они появятся в списке.
Я не эксперт, и этот ответ довольно прост по сравнению с тем, что люди отвечают (проверяют реестр), поэтому я не уверен, правильный ли это ответ, но он помог мне.
Мне удалось сделать это с помощью InnoSetup.
Я проверил наличие ключа реестра:
HKLM\SOFTWARE\Microsoft\VisualStudio\11.0\VC\Runtimes
В случае удаления его не существует. Если установлен, он существует.
Кстати, это тоже могло быть в Wow6432Node:
HKLM\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\11.0\VC\Runtimes
Проверка состояния установки продукта через 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 , что бинарный файл был построен с.
Этот код PowerShell должен помочь
Get-ItemProperty
HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* |
Select-Object DisplayName, DisplayVersion, Publisher, InstallDate |
Format-Table –AutoSize
Мне нужно было то же самое, и хотя AFAIK это нельзя сделать программно, у меня это сработало.
Я просто пошел в Пуск -> Удалить программу и прокручивал вниз, пока не нашел распространяемый пакет VC ++, который включает номер версии. Погуглил номер версии, сказал мне, что он принадлежит VS2012 SP1.
Старый вопрос, но вот подход, который мы успешно использовали с 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.
Большинство людей упускают из виду необходимость /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
Решение сценария 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
Любой желающий может внести свой вклад, если у меня будет время, я проведу более обширное тестирование скрипта и буду продолжать попытки добавлять новые пакеты по мере добавления информации здесь.
Получить все значения реестра для 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;
Вы можете искать в реестре. На самом деле у меня нет 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
Для этого вы можете использовать функцию реестра ......
HKLM\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\10.0\VC\VCRedist\...