Визначте, чи встановлено перерозподільний Visual C ++ для Visual Studio 2012


109

Як визначити, чи встановлено перерозподілюваний Visual C ++ для Visual Studio 2012?

Я спробував Google, і це ніхто не задавав цього питання, здивування!


1
Чому б не усунути цю залежність, встановивши бібліотеку виконання в C ++> генерації коду на багатопотоковий [налагодження] замість багатопотокового [налагодження] dll? Я щойно вирішив проблему встановлення перегляду часу, просто усунувши залежність.
Джем Кальонку

Я дізнався, як виявити пакети шляхом спроб та помилок. Мені б хотілося, щоб була чарівна куля, але якщо є, я її ще не знайшов. У мене є відповідь вниз нижче для деяких конкретних redists , які , здається, працюють 100% від часу , щоб допомогти з в даний час більшість з них.
kayleeFrye_onDeck

3
Будь ласка, подумайте про зміну прийнятої відповіді на відповідь від kayleeFrye_onDeck. Я витратив віки на пошуки надійного методу, і, здається, це один, я думаю, що з усіма іншими ненадійними відповідями він допоможе багатьом людям знайти потрібну інформацію
musefan

Здається, є оновлення для виконання Visual Studio 2017: 14.10.V25017. Посилання: go.microsoft.com/fwlink/?LinkId=746572 Чи можете ви оновити значення реєстру?
karel vergauwe

Відповіді:


172

Це залежить від того, яку версію ви використовуєте. Ці два ключі 2012 року добре спрацювали зі своїми відповідними версіями для завантаження оновлення 4. Будь ласка, майте на увазі, що деякі з цих регіонів можуть залежати від ОС. Я зібрав цю інформацію з вікна Windows 10 x64 . Я просто збираюся йти і вивантажувати всі ці переглянуті версії та клавіші 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

Застереження щодо версії : Зависновками Вай Ха Лі Лі , "... бінарні файли, які постачаються з оновленням VC ++ 2012 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 як альтернативу

Caveat : або використовується нова конвенція реєстру 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 )

Caveat : Існує ще одна нова конвенція реєстру, яка використовується для 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 проти 14.16
12 вересня 2018 р. - Додано попередження щодо версії до 2012 року. Оновлення 4 за висновками Вай Ха Лі
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 встановлений або час виконання не видалено.

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

4
на жаль, це не містить VCREDIST 14.0 Оновлення 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 \ Обслуговування \ 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 із встановленим режимом виконання VC ++ 2012 року, і у мене немає цього ключа рег.
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 на свіжому VM відносного інтерфейсу, і це єдиний ключ, який я знайшов після цього. Тож великий палець вгору з мого боку ...
anhoppe

12

В маніфесті пакета завантажувального пакета немає елемента встановлення, який постачається з Visual C ++. Здається, Microsoft хоче завжди встановлювати, якщо ви встановите це як необхідну умову.

Звичайно, ви все ще можете зателефонувати в MsiQueryProductState, щоб перевірити, чи встановлений перехідний пакет VC через MSI, код пакета можна знайти, запустивши

wmic product get

в командному рядку, або якщо ви вже перебуваєте в wmic: root \ cli, run

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

10

На жаль, відповідь на це просте запитання не є простим, але працює у 100% усіх систем і навіть розширюється на численні рамки .net.

Складність пов'язана з тим, що існує (і було) багато змін часу виконання VC, що може призвести до того, що, хоча час виконання 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 для використання 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 (оновлення 1 для VS2012).


+1 це простіше і надійніше. Ключі реєстру все добре і подібні, але якщо користувач заблукав із системою та видалив msvcr110.dll перевірка реєстру марна. Найкраще перевірити всі необхідні вам компоненти (msvcr110.dll, msvcp110.dll, mfc, ...). А для оновлення 3 версія - 11.0.60610.1.
stijn

ОК ігноруйте цей останній біт: здається, що інсталятор 11.0.60610.1, версія crt dlls все ще 11.0.51106.1
ст

ya the .dll 11.0.51106.1, хоча у мене встановлено vs2012 sp4
Blub

Це не спрацює. Я видалив 2005-2015 роки, і досі у мене є файли msvc для 60, 100, 110, 120 та 140.
kayleeFrye_onDeck

Зауважте, що бінарні файли, що постачаються з оновленням VC ++ 2012 (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 (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 for 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_action.html


4

Для мене це місце працювало: HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ DevDiv \ vc \ Обслуговування \ 11.0 \ RuntimeMinimum \ Версія

Перевірте, яка версія у вас після встановлення пакета, і використовуйте це як умову у своєму інсталяторі. (після встановлення VCred встановлено значення 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

Якщо її видалити, вона не існує. Якщо він встановлений, він існує.

До речі, це також може бути у вузлі Wow6432:

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


Це неправда. Ключі існують в обох місцях після їх видалення.
kayleeFrye_onDeck

1
@kayleeFrye_onDeck Так ... я повинен погодитися з вами. Але насправді, коли я спробував це вперше, це було успішно. Але останнім часом це так, як ви сказали. Я не знаю, чому це так.
Фанді Сусанто

3

Перевірка стану встановлення продукту за допомогою MsiQueryProductState - це майже рівнозначна безпосередньо перевірка реєстру, але вам все одно потрібен GUID для ProductCode .

Як було зазначено в іншому місці, один недолік цих підходів полягає в тому, що кожне оновлення має свій ProductCode!

На щастя, MSI забезпечує UpgradeCode, який ідентифікує "сімейство" продуктів. Ви можете використовувати orca для відкриття однієї з MSI для отримання цієї інформації. Наприклад, оновлений код оновлення для 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 / сімейства є загальною для встановників MSI.
adzm

Мені відомо Орка. Проблема пов'язана з тим, як потрапити до цієї MSI. Я не знаю способу прямого доступу до нього. Єдиний спосіб, про який я знаю, - це якимось чином знайти його в каталозі c: \ Windows \ Installer. У мене в цьому каталозі понад 1000 файлів. Файли названі випадковим чином. Єдиний спосіб визначити, який MSI є правильним - подивитися опис. Це включає попадання Alt + Enter на 1000 файлів у Провіднику або використання інструменту для скидання описів 1000 файлів.
Бен Кі

Ах, я бачу. Ви можете здійснити пошук у реєстрі, щоб знайти шлях або навіть код оновлення, якщо вам відомий код продукту, у HKLM \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Installer \ UpgradeCodes. Однак вам може знадобитися використовувати WMIC (або якийсь інший програмний доступ до msi db), щоб розібратися з рештою. 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 ++ реєструють свою деінсталятор разом із вікнами (так це відображається у списку "Програми та функції" на панелі керування), ми просто перевіряємо, чи відображається ім'я ключа видалення в реєстрі.

Ось відповідний код 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, не вимагаючи чітко перевіряти обидві клавіші.

Також зауважте, що для оновлення вищевказаного коду до іншої версії Redist VC ++, просто змініть GUID у шляху ключа реєстру та відображуваного імені на все, що вам потрібно.

Хоча це може бути не рекомендованим методом, він працював на 10 000+ машинах протягом останніх 10 років, використовуючи будь-який смак Windows з XP / XP64 Через Windows 10, використовуючи перелік 2005, 2010, 2010sp1 та 2012 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

Рішення сценарію повноважень:

На основі інформації у відповіді від @kayleeFrye_onDeck

Я створив скрипт powerhell, який перевіряє та встановлює версії, які вказує користувач, я не робив обширного тестування з ним, але для мого власного сценарію CI (Continuous Integration) він працює чудово.

Повний сценарій та інформація про 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'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, оскільки це було питанням ОП (але не вдалося підтвердити, оскільки у вас немає VS2012). Я просто заявив, що такий підхід насправді не працює з VS2012, оскільки я перевірив його.
StellarEleven

Чому вниз голосувати за мою відповідь ...... Я маю писати ясно, що це за vs2012 ... і це прийнято як відповідь користувача .... так чому ???????????
vikky

1
Схоже , що з 64 бітної ОС це значення знаходиться вHKLM\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\10.0\VC\VCRedist\...
барельєф

1
Клавішами VS 2012 є HKLM \ SOFTWARE \ Microsoft \ VisualStudio \ 11.0 \ VC \ RunTimes ____ HKLM \ SOFTWARE \ Wow6432Node \ Microsoft \ VisualStudio \ 11.0 \ VC \ RunTimes ___
Adam L
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.