Wykryj, czy jest zainstalowany pakiet redystrybucyjny Visual C ++ dla programu Visual Studio 2012

109

Jak wykryć, czy jest zainstalowany pakiet redystrybucyjny Visual C ++ dla programu Visual Studio 2012?

Wypróbowałem go w Google i nikt nie zadał tego pytania, niespodzianka!

sean717
źródło
1
Dlaczego nie usunąć tej zależności, ustawiając bibliotekę wykonawczą w C ++> Generowanie kodu na Wielowątkowy [debugowanie] zamiast wielowątkowej [debugowania] dll? Właśnie rozwiązałem problem z instalacją redystrybucyjną, po prostu usuwając zależność.
Cem Kalyoncu
Dowiedziałem się, jak wykrywać pakiety metodą prób i błędów. Chciałbym, żeby istniała magiczna kula, ale jeśli jest, to jeszcze jej nie znalazłem. Poniżej mam odpowiedź na kilka konkretnych redystów, które wydają się pracować w 100%, pomagając obecnie w większości z nich.
kayleeFrye_onDeck
3
Prosimy o rozważenie zmiany zaakceptowanej odpowiedzi na tę przez kayleeFrye_onDeck. Spędziłem wieki szukając niezawodnej metody i wydaje mi się, że jest to jedna, myślę, że przy wszystkich innych niewiarygodnych odpowiedziach pomoże ona wielu ludziom znaleźć właściwe informacje
musefan
Wydaje się, że istnieje aktualizacja dla środowisk wykonawczych programu Visual Studio 2017: 14.10.V25017. Link: go.microsoft.com/fwlink/?LinkId=746572 Czy możesz zaktualizować wartości rejestru?
karel vergauwe

Odpowiedzi:

172

To zależy od używanej wersji. Te dwa klucze 2012 działały dobrze w przypadku ich odpowiednich wersji do pobrania w aktualizacji 4. Należy pamiętać, że niektóre z tych lokalizacji rejestrów mogą być zależne od systemu operacyjnego. Zebrałem te informacje z pudełka z systemem Windows 10 x64 . Zamierzam po prostu zrzucić wszystkie wersje redystrybucyjne i klucze reg, których szukam, aby wykryć instalację .:


Visual C ++ 2005

Microsoft Visual C++ 2005 Redistributable (x64)
Registry Key: HKLM\SOFTWARE\Classes\Installer\Products\1af2a8da7e60d0b429d7e6453b3d0182
Configuration: x64
Version: 6.0.2900.2180

Bezpośredni adres URL pobierania: 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

Bezpośredni adres URL pobierania: 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])

Bezpośredni adres URL pobierania: 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])

Bezpośredni adres URL pobierania: 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

Bezpośredni adres URL pobierania: 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

Bezpośredni adres URL pobierania: 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

Bezpośredni adres URL pobierania: 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

Bezpośredni adres URL pobierania: https://download.microsoft.com/download/1/6/B/16B06F60-3B20-4FF2-B699-5E9B7962F9AE/VSU_4/vcredist_x86.exe

Ostrzeżenie dotyczące wersji : Wedługustaleń Wai Ha Lee użytkownika, „... pliki binarne, które są dostarczane z aktualizacją 4 ( 11.0.61030.0) VC ++ 2012, mają wersję 11.0.60610.1dla plików binarnych ATL i MFC oraz 11.0.51106.1dla wszystkiego innego, np. msvcp110.dll i 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

Bezpośredni adres URL pobierania: 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

Bezpośredni adres URL pobierania: https://download.microsoft.com/download/2/E/6/2E61CFA4-993B-4DD4-91DA-3737CD5CD6E3/vcredist_x86.exe


Visual C ++ 2015

Rozważ użycie pakietu 2015–2019 jako alternatywy

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

Bezpośredni adres URL pobierania: 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

Bezpośredni adres URL pobierania: https://download.microsoft.com/download/6/A/A/6AA4EDFF-645B-48C5-81CC-ED5963AEAD48/vc_redist.x86.exe


Visual C ++ 2017

Rozważ użycie pakietu 2015–2019 jako alternatywy

Uwaga : albo używana jest nowa konwencja rejestru z 2017 r., Albo nie została jeszcze sfinalizowana. Jak zgaduję, najwyższe klawisze: [HKEY_CLASSES_ROOT\Installer\Dependencies\,,amd64,14.0,bundle] i [HKEY_CLASSES_ROOT\Installer\Dependencies\,,x86,14.0,bundle]

mogą ulec zmianie lub przynajmniej mają różne zagnieżdżone identyfikatory GUID, użyję listy kluczy kończących się identyfikatorem 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

Bezpośredni adres URL pobierania: 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

Bezpośredni adres URL pobierania: https://download.visualstudio.microsoft.com/download/pr/d0b808a8-aa78-4250-8e54-49b8c23f7328/9c5e6532055786367ee61aafb3313c95/vc_redist.x86.exe


Visual C ++ 2019 ( pakiet 2015-2019 )

Uwaga : w programie Visual C ++ 2019 jest używana inna nowa konwencja rejestru. Wydaje się również, że nie istnieje samodzielny instalator programu Visual C ++ 2019, tylko ten instalator pakietu, czyli Visual C ++ od 2015 do 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  

Bezpośredni adres URL pobierania: 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

Bezpośredni adres URL pobierania: 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

Bezpośredni adres URL pobierania: 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

Bezpośredni adres URL pobierania: https://download.visualstudio.microsoft.com/download/pr/cc0046d4-e7b4-45a1-bd46-b1c079191224/9c4042a4c2e6d1f661f4c58cf4d129e9/vc_redist.x64.exe


Dziennik zmian :
19 sierpnia 2019 r. - Dodano nową wersję wersji pakietu 2015–2019
13 czerwca 2019 r. - Dodano nową sekcję dotyczącą wersji pakietu 2015–2019 14.21.27702i dodano małe uwagi do sekcji 2015 i 2017 na temat rozważania użycia nowy pakiet jako alternatywa.
14 grudnia 2018 - Zaktualizowano MSVC2008 dla aktualizacji Service Pack 1 9.0.30729.6161zgodnie z ustaleniami Jima Wolffa 16 maja 2018 - Zaktualizowano wersję 2017 dla 14.14.26405.0 jako nowy wpis C ++ 2017 7 kwietnia 2017 - Zaktualizowana wersja 2017 z 14.10.25008.0 jako nowy wpis dotyczący języka Visual C ++ 2017 24 października 2016 r. - Zaktualizowano informacje o wersji z 2015 r. dla 14.0.24215.1 18 sierpnia 2016 r. - Zaktualizowano informacje o wersji 2015 r. dla 14.0.24212
27 listopada 2018 r. - Zaktualizowano informacje dotyczące MSVC2017 wer. 14.16
12 września 2018 r. - Dodano zastrzeżenie dotyczące wersji do 4 Aktualizacji 2012 zgodnie z ustaleniami Wai Ha Lee
24 sierpnia, 2018 - zaktualizowana wersja 2017 dla 14.15.26706, zaktualizowane zależności Visual C ++ spakowane z VS 2017 15.8.1

8 września 2017 - Zaktualizowana wersja 2017 dla 14.11.25325.0 jako nowy wpis Visual C ++ 2017 27 maja 2016 r. - Zaktualizowano informacje dotyczące aktualizacji MSVC2015 2




Skontaktuj się ze mną tutaj, jeśli którykolwiek z nich stanie się nieaktualny.

kayleeFrye_onDeck
źródło
4
To jest doskonałe. Jest to jedyny, który znalazłem, który nie daje fałszywych alarmów, gdy jest zainstalowany program Visual Studio lub środowisko uruchomieniowe jest odinstalowywane.
AN
2
Identyfikator GUID VS2015 przed aktualizacją 1 to {74d0e5db-b326-4dae-a6b2-445b9de1836e}, więc możesz dostać się do marynaty za pomocą tego mechanizmu. Do każdej przyszłej aktualizacji! Uruchomienie programu VCRedist sprzed aktualizacji 1 z zainstalowaną aktualizacją 1 spowodowało błąd - więc zamierzam użyć klucza reg instalatora VC - co wydaje się być w porządku, jeśli używasz programu VCRedist?
GilesDMiddleton
4
niestety nie zawiera VCREDIST 14.0 Update 2 - jak poradzimy sobie z kompatybilnością z przodu (wykrywanie nowszych, kolejnych wersji tego samego środowiska uruchomieniowego)
Shaun Wilson
2
@ManjunathBabu, nie sądzę, aby istniała żadna zewnętrzna dokumentacja dotycząca konwencji rejestru dla instalatorów redystrybucyjnych Visual C ++. Właśnie zauważyłem, że wydawało się, że faktycznie podążają za czymś podobnym tym razem do schematu na rok 2017, zamiast po prostu wrzucić gdzieś inny identyfikator GUID bez znaczącej nazwy klucza nadrzędnego. Do tej pory korzystali z tych lokalizacji dla wszystkich wydanych instalatorów na rok 2017: [HKEY_CLASSES_ROOT\Installer\Dependencies\,,x86,14.0,bundle\Dependents\{$GUID}i[HKEY_CLASSES_ROOT\Installer\Dependencies\,,amd64,14.0,bundle\Dependents\{$GUID}
kayleeFrye_onDeck
2
Nowy pakiet Visual C ++ 2017 zmienia ścieżkę rejestru (wersja 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

Próbować

HKLM\SOFTWARE\Microsoft\DevDiv\VC\Servicing\11.0

jako punkt wyjścia. Użyję tego jako sprawdzianu do zainstalowania środowiska wykonawczego VC ++ 11 (VS 2012).

Dave Dawkins
źródło
7
HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ DevDiv \ vc \ Servicing \ 11.0 \ RuntimeMinimum \ Install należy ustawić na 1
Alex Spence,
3
W przypadku wersji 32-bitowej (aka x86) klucz znajduje się pod adresem:HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\DevDiv\VC\Servicing\11.0\RuntimeMinimum
CodeFox,
@kayleeFrye_onDeck czy znalazłeś, jak to zrobić? Wciąż szukam niezawodnego sposobu, ale żadna z odpowiedzi na tej stronie nie zadziałała dla mnie
AN
Odpowiedź lepsza niż zaakceptowana, ponieważ nie opiera się na UUID pakietu, prawdopodobnie zmieni się z każdą poprawką dostarczoną przez Microsoft
jpo38
25

Możesz sprawdzić, czy Installedwartość znajduje się 1w tej lokalizacji rejestru: HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\11.0\VC\Runtimes\x86w systemach 64-bitowych. W kodzie, który spowodowałby dostęp do klucza rejestru HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\11.0\VC\Runtimes\x86. Zwróć uwagę na brak Wow6432Node.

W systemie 32-bitowym rejestr jest taki sam bez Wow6432Node:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\11.0\VC\Runtimes\x86

Mike de Klerk
źródło
Mam 32-bitową maszynę Win7 z zainstalowanym środowiskiem wykonawczym 2012 VC ++ i nie mam tego klucza reg.
BryanJ
Czy na pewno nie masz `HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ VisualStudio \ 11.0 \ VC`? Co masz?
Mike de Klerk
2
Mam, HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\11.0\VCale nie mam Runtimesklucza. Mam klucz w odpowiedzi Dave'a HKLM\SOFTWARE\Microsoft\DevDiv\VC\Servicing\11.0.
BryanJ
@BryanJ Dziwne, że każdy system może być tak inny ... Dzięki za dodanie tych przydatnych informacji
Mike de Klerk
3
Zabawna historia i żadne prawdziwe informacje od stwardnienia rozsianego. Myślę, że masz najlepszą odpowiedź, jaką do tej pory zauważyłem. Testowano instalację vcredist na stosunkowo świeżej maszynie wirtualnej i jest to jedyny klucz, jaki znalazłem później. Więc kciuk z mojej strony ...
anhoppe
12

W manifeście pakietu programu ładującego dostarczanego z programem Visual C ++ nie ma elementu installcheck. Chyba Microsoft chce zawsze instalować, jeśli ustawisz to jako warunek wstępny.

Oczywiście nadal możesz zadzwonić do MsiQueryProductState, aby sprawdzić, czy pakiet redystrybucji VC jest zainstalowany za pośrednictwem MSI.Kod pakietu można znaleźć, uruchamiając

wmic product get

w wierszu poleceń lub jeśli jesteś już w wmic: root \ cli, uruchom

product where "Caption like '%C++ 2012%'"
Sheng Jiang 蒋 晟
źródło
10

Odpowiedź na te proste pytania nie jest niestety prosta, ale działa w 100% wszystkich systemów, a nawet daje się rozszerzyć na liczne frameworki .net.

Złożoność wynika z faktu, że istnieje (i było) wiele wersji środowiska wykonawczego VC, które mogą prowadzić do przypadku, że chociaż środowiska wykonawcze VC10 zostały zainstalowane, ich numer kompilacji nie był wystarczająco nowy, więc plik EXE nie zostałby uruchomiony, chyba że zainstalowano dokładne wymagane środowiska wykonawcze lub jeden z nowszych środowisk wykonawczych, które umożliwiają działanie tej i poprzednich wersji dla tej samej wersji głównej (piekło obok siebie). Ponadto, jeśli masz 64-bitowy plik EXE, będziesz musiał sprawdzić oba środowiska wykonawcze 32 i 64 bitowe.

To powiedziawszy, jedynym niezawodnym sposobem ustalenia, czy środowiska wykonawcze dla twojego EXE są zainstalowane, jest próba uruchomienia EXE - lub innego EXE, który jest zbudowany z tymi samymi ustawieniami co twój główny EXE i którego jedynym celem jest nic. Po prostu uruchom (co oznacza, że ​​środowiska wykonawcze są zainstalowane) lub nie działają (jeśli nie są zainstalowane).

Wykonałem następujące czynności dla instalatora, który wymagał zainstalowania 32 i 64-bitowych środowisk wykonawczych VC10: Instalator próbuje uruchomić wszystkie fałszywe pliki EXE i jeśli to się powiedzie, odpowiednie środowisko wykonawcze jest uważane za zainstalowane. To również rozwiązuje scenariusz 32/64 bitowy.

Nawiasem mówiąc, działa to również w celu ustalenia, czy zainstalowana jest odpowiednia struktura .net, co jest bardzo trudne w Windows 8 i 10, ponieważ wbudowana do pobrania obsługa .net 3.5 obsługuje również wersje .net 3.0 i 2.0 - tam nie ma dla nich wpisów w rejestrze. (Co gorsza, nie możesz tutaj nawet użyć standardowych instalatorów frameworka, musisz skorzystać z wbudowanej obsługi i pobrać ją przez Windows lub przebudować aplikację z .net 4, ale to już inna historia).

Dummy EXE C ++ można zbudować przy użyciu projektu z następującym kodem (i w razie potrzeby innego w konfiguracji 64-bitowej):

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

Pamiętaj, aby ustawić właściwości projektu Użyj MFC do używania MFC w udostępnionej bibliotece DLL . Pliki wykonywalne będą miały rozmiar około 4KB - niewielka cena za pewny wynik.

Aby zapewnić użytkownikom przyjemną instalację, możesz wykonać następujące czynności (przykładowy kod dotyczy NSIS ):

Function TryLaunchApplication
  Pop $1 ; pathname
  nsExec::Exec $1
  Pop $0

  ${If} $0 == "error"
  ${OrIf} $0 != 0
    Push 0
  ${Else}
    Push 1
  ${EndIf}
FunctionEnd

i wywołaj go w funkcji, np. 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

Następnie uruchom sprawdzanie środowiska uruchomieniowego, np. Opuszczając stronę powitalną i zapisz wynik w pamięci podręcznej, dzięki czemu nie musisz sprawdzać ponownie za każdym razem, gdy użytkownik kliknie przycisk „Wstecz” i „Dalej”.

Następnie utwórz sekcję tylko do odczytu w drzewie instalacji i zaznacz ją wstępnie lub odznacz ją w funkcji, która jest wykonywana przed wyświetleniem strony Komponenty .

Zapewni to, że instalacja każdego brakującego składnika środowiska wykonawczego jest obowiązkowa i jest pomijana, jeśli jest już obecna.

Michael
źródło
Dziękuję za pomocną wskazówkę, czy pamiętasz jaki typ projektu ma powstać? VS ma ich mnóstwo do wyboru :-).
greenoldman
9

Ponieważ program Visual Studio 2010 i później przestał używać WinSxS, może wystarczyć sprawdzenie% windir% \ system32 \ msvcr110.dll. Jeśli chcesz sprawdzić, czy masz wystarczająco nową wersję, możesz sprawdzić, czy wersja pliku to 11.0.50727.1 (VS2012 RTM) czy 11.0.51106.1 (VS2012 Update 1).

BCran
źródło
+1 to jest prostsze i bardziej niezawodne. Klucze rejestru są w porządku i takie, ale jeśli użytkownik bałaganił w systemie i usuwał msvcr110.dll, sprawdzanie rejestru jest bezużyteczne. Najlepiej jednak sprawdzić wszystkie potrzebne składniki (msvcr110.dll, msvcp110.dll, mfc, ...). W przypadku aktualizacji 3 wersja to 11.0.60610.1.
stijn
ok zignoruj ​​ten ostatni bit: wydaje się, że tylko instalator to 11.0.60610.1, wersja bibliotek dll crt to nadal 11.0.51106.1
stijn
tak, plik .dll to 11.0.51106.1, mimo że mam zainstalowany vs2012 sp4
Blub
To nie zadziała. Odinstalowałem 2005-2015 i nadal mam tam pliki msvc dla 60, 100, 110, 120 i 140.
kayleeFrye_onDeck
Zauważ, że pliki binarne, które są dostarczane z aktualizacją 4 ( 11.0.61030.0) VC ++ 2012, mają wersję 11.0.60610.1dla plików binarnych ATL i MFC, a także 11.0.51106.1dla wszystkiego innego, np. Msvcp110.dll i msvcr110.dll. Nie pewny dlaczego. Możesz to potwierdzić (na komputerach z systemem Windows 10, na których go przetestowałem), przechodząc do C:\ProgramData\Package Cache\{BD95A8CD-1D9F-35AD-981A-3E7925026EBB}v11.0.61030\packages\vcRuntimeMinimum_x86i C:\ProgramData\Package Cache\{B175520C-86A2-35A7-8619-86DC379688B9}v11.0.61030\packages\vcRuntimeAdditional_x86sprawdzając pliki w plikach .cab.
Wai Ha Lee,
5

Natknąłem się na to pytanie, szukając odpowiedzi w kontekście sprawdzania redystrybucji Visual C ++ w ramach instalatora MSI stworzonego przez WiX.

Nie podobało mi się, jak zmienia się GUID wraz z wersją i systemem operacyjnym, więc w końcu utworzyłem niestandardową akcję napisaną w C #, aby sprawdzić, czy istnieje redystrybucja Visual C ++.

Wszystko poniżej dotyczy programu redystrybucyjnego Visual C ++ 2015 (x64), ale można je łatwo zmodyfikować dla dowolnej wersji.

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;
        }
    }
}

Następnie w pliku 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>

Edytuj Aktualizuję tę odpowiedź o kilka podstawowych informacji na temat tworzenia i używania akcji niestandardowej.

Aby utworzyć akcję niestandardową w programie Visual Studio 2017 z zainstalowanym rozszerzeniem WiX Toolset Visual Studio 2017, użyłem szablonu projektu do utworzenia akcji niestandardowej (C # Custom Action Project for WiX v3).

Sprawdziłem wygenerowany projekt i wydawało się, że zmiany są już wymienione na początku tego artykułu: https://www.codeproject.com/Articles/132918/Creating-Custom-Action-for-WIX-Written-in-Managed więc wybrałem ten artykuł w sekcjiAdding Custom Action to the Installer i wprowadziłem kilka poprawek.

Inną rzeczą, którą zrobiłem, była zmiana wersji frameworka .NET, dla którego projekt jest zbudowany, na 3.5.

Nie uważałem tego za przydatne, ale możesz również zobaczyć http://wixtoolset.org/documentation/manual/v3/wixdev/extensions/authoring_custom_actions.html

TJ Rockefeller
źródło
4

Dla mnie ta lokalizacja zadziałała: HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ DevDiv \ vc \ Servicing \ 11.0 \ RuntimeMinimum \ Version

Sprawdź, jaką masz wersję po zainstalowaniu pakietu i użyj tego jako warunku w swoim instalatorze. (mój jest ustawiony na 11.0.50727 po zainstalowaniu VCred).

attila
źródło
Ta odpowiedź jest dokładnie tym, czego szukaliśmy (w porównaniu z innymi odpowiedziami tutaj, które są niestety mniej o środowisku wykonawczym, a więcej o Visual Studio).
Shaun Wilson
Ta odpowiedź nie działa, ponieważ ten klucz istnieje po odinstalowaniu redystów.
kayleeFrye_onDeck
4

Po prostu przejdź do Panelu sterowania> Programy i funkcje, a wszystkie zostaną tam wyświetlone.

Nie jestem ekspertem, a ta odpowiedź jest dość prosta w porównaniu z tym, na co odpowiadają ludzie (sprawdzanie rejestru), więc nie jestem pewien, czy to poprawna odpowiedź, ale mi się udało.

Programy i funkcje

Adrian Pauly
źródło
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
Al.Pertro
źródło
3

Udało mi się to zrobić z InnoSetup.

Sprawdziłem istnienie klucza rejestru:

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

Jeśli zostanie odinstalowany, nie istnieje. Jeśli jest zainstalowany, istnieje.

Nawiasem mówiąc, może to być również w Wow6432Node:

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

Fandi Susanto
źródło
To nieprawda. Klucze znajdują się w obu lokalizacjach, gdy zostały odinstalowane.
kayleeFrye_onDeck
1
@kayleeFrye_onDeck Tak ... Muszę się z tobą zgodzić. Ale w rzeczywistości, kiedy spróbowałem tego po raz pierwszy, odniosło sukces. Ale ostatnio jest tak, jak powiedziałeś. Nie wiem, dlaczego tak jest.
Fandi Susanto
3

Sprawdzanie stanu instalacji produktu za pośrednictwem MsiQueryProductState jest w zasadzie równoważne z bezpośrednim sprawdzeniem rejestru, ale nadal potrzebujesz identyfikatora GUID dla ProductCode .

Jak wspomniano w innym miejscu, jedną wadą tych podejść jest to, że każda aktualizacja ma swój własny kod produktu!

Na szczęście MSI udostępnia UpgradeCode, który identyfikuje „rodzinę” produktów. Możesz użyć orca, aby otworzyć jeden z MSI w celu wyodrębnienia tych informacji. Na przykład UpgradeCode dla pakietu redystrybucyjnego VS2015 to{65E5BD06-6392-3027-8C26-853107D3CF1A}

Możesz użyć MsiEnumRelatedProducts, aby uzyskać wszystkie identyfikatory produktów dla tego UpgradeCode. W praktyce, ponieważ każda aktualizacja redystrybucyjna zastępuje poprzednią, przyniesie to tylko jeden kod produktu - na przykład w {B5FC62F5-A367-37A5-9FD2-A6E137C0096F}przypadku VS2015 Update 2 x86.

Niezależnie od tego, możesz następnie sprawdzić wersję za pomocą MsiGetProductInfo (kod produktu, INSTALLPROPERTY_VERSIONSTRING, ...) lub podobne funkcje, aby porównać z wersją, którą chcesz, np. Sprawdzić wersję równoważną lub nowszą.

Należy zauważyć, że w aplikacji C ++, można również użyć _VC_CRT_MAJOR_VERSION, _VC_CRT_MINOR_VERSION, _VC_CRT_BUILD_VERSIONjeśli #include <crtversion.h>- w ten sposób można określić, obliczyć wersji CRT, że został zbudowany z binarnym.

adzm
źródło
Skąd masz te informacje? I czy to jest UpgradeCode dla wersji x86 czy dla wersji x64?
Ben Key,
Możesz użyć Orca, aby otworzyć msi i wyodrębnić UpgradeCode. Ten podany tutaj dotyczy co najmniej x86. Jeśli chodzi o to, skąd uzyskałem pozostałe informacje, to jest to właściwie główne źródło; Nie mogłem znaleźć innych odniesień do tego podejścia w Internecie, dotyczących konkretnie redystrybucji, ale wzorzec UpgradeCode / rodziny jest wspólny dla instalatorów MSI.
adzm
Jestem świadomy istnienia Orca. Problem polega na dotarciu do tego MSI. Nie znam sposobu, aby uzyskać do niego bezpośredni dostęp. Jedynym sposobem, jaki znam, jest znalezienie go w katalogu c: \ Windows \ Installer. Mam ponad 1000 plików w tym katalogu. Pliki nazywane są losowo. Jedynym sposobem ustalenia, który plik MSI jest poprawny, jest zapoznanie się z opisem. Obejmuje to naciśnięcie Alt + Enter na 1000 plików w eksploratorze lub użycie narzędzia do zrzucenia opisów 1000 plików.
Ben Key,
Ahh rozumiem. Możesz również przeszukać rejestr, aby znaleźć ścieżkę lub nawet kod uaktualnienia, jeśli znasz kod produktu, w HKLM \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Installer \ UpgradeCodes. Jednak może być konieczne użycie WMIC (lub innego programistycznego dostępu do bazy danych msi), aby dowiedzieć się więcej. produkt wmic get / format: csv zrzuci plik csv, który możesz przeszukać - zawiera ścieżki msi w zwracanych wartościach. Mógłbyś napisać lepszy scenariusz, jestem pewien, ale to powinno wystarczyć, abyś mógł zacząć działać.
adzm
3

Ten kod PowerShell powinien załatwić sprawę

Get-ItemProperty
HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* | 
Select-Object DisplayName, DisplayVersion, Publisher, InstallDate |
Format-Table AutoSize
Ernie C
źródło
ponieważ zakodowanie na stałe wielu kodów produktów nie będzie działać, również wyliczamy rejestr, sprawdzając „nazwę produktu” każdego wpisu za pomocą wyrażenia regularnego, a następnie sprawdzamy VersionMajor / VersionMinor (czyli wszystko, na czym naprawdę nam zależy) to ma wartość umożliwienia nam wyprodukowania pojedynczej kompilacji i wiedzy, że będzie ona działać przez cały okres użytkowania danej wersji vcredist. intencja jest tu trafiona, ale może wymagać transliteracji dla zestawów narzędzi, takich jak instalatory NSIS lub WinAPI.
Shaun Wilson
2

Potrzebowałem tego samego i chociaż AFAIK nie da się tego zrobić programowo, to zadziałało.

Po prostu przeszedłem do Start -> Odinstaluj program i przewijałem w dół, aż znalazłem pakiet redystrybucyjny VC ++, który zawiera numer wersji. Wygooglowując numer wersji, powiedział mi, że należy do VS2012 SP1.

bavaza
źródło
2

Stare pytanie, ale tutaj jest podejście, którego używaliśmy z sukcesem od czasu programu Visual Studio 2005. Właśnie przetestowałem to również przy użyciu Visual Studio 2012 Update 4 (ponieważ w końcu aktualizujemy nasze oprogramowanie od 2010 do 2012).

Ponieważ pakiety redystrybucyjne Visual C ++ rejestrują dezinstalator w systemie Windows (więc pojawia się on na liście „Programy i funkcje” w Panelu sterowania), po prostu sprawdzamy nazwę wyświetlaną klucza dezinstalatora w rejestrze.

Oto odpowiedni kod 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:

Zwróć uwagę, że ponieważ nasz instalator jest 32-bitowym exe, system Windows określa, czy klucz rejestru znajduje się w rzeczywistości zwirtualizowanym Wow6432Node zamiast w powyższej lokalizacji, więc powyższy kod działa zarówno w 64-bitowych, jak i 32-bitowych instalacjach Windows bez konieczności jawnego sprawdzania obu kluczy.

Należy również pamiętać, że aby zaktualizować powyższy kod do innej wersji VC ++ Redist, po prostu zmień identyfikator GUID w ścieżce klucza rejestru i nazwę wyświetlaną na dowolną potrzebną.

Chociaż może to nie być zalecana metoda, sprawdziła się na ponad 10000 maszynach w ciągu ostatnich 10 lat, uruchamiając wszystkie wersje systemu Windows od XP / XP64 do Windows 10 przy użyciu redystów na lata 2005, 2010, 2010sp1, a teraz 2012u4.

kinar
źródło
1

Sprawdziłbym Installedwartość

HKLM\SOFTWARE\[WOW6432Node]\Microsoft\Windows\CurrentVersion\Uninstall\{VCRedist_GUID} klucz

  • gdzie GUID VC++ 2012 (x86)jest{33d1fd90-4274-48a1-9bc1-97e33d9c2d6f}
  • WOW6432Nodebędzie obecny lub nie, w zależności od VC++ redistproduktu
Uczeń
źródło
0

Większość ludzi tęskni za koniecznością /reg:32sprawdzenia klucza w systemie Windows x64.

Zobacz artykuł pomocy Microsoft na ten temat.

Oto skrypt, który pokazuje, jak poprawnie sprawdzić, czy pakiet redystrybucyjny Visual C ++ dla programu Visual Studio 2012 Update 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
war59312
źródło
0

Rozwiązanie skryptowe PowerShell:

Na podstawie informacji zawartych w odpowiedzi od @kayleeFrye_onDeck

Stworzyłem skrypt PowerShell, który sprawdza i instaluje wersje określone przez użytkownika, nie przeprowadziłem z nim obszernych testów, ale w moim własnym scenariuszu CI (Continuous Integration) działa idealnie.

Pełny skrypt i informacje na githubie

Podejście, które zastosowałem, polegało na sprawdzeniu kluczy rejestru na podstawie informacji podanych tutaj. Oto istota tego, co robi skrypt:

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
    }
}

Sprawdzanie / pobieranie / cicha instalacja, na podstawie $redistInfoktórej zawiera skompilowane informacje z 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
}

Pełny skrypt i więcej informacji można znaleźć na github

Każdy może wnieść swój wkład, jeśli będę miał czas, przeprowadzę bardziej szczegółowe testy skryptu i będę próbował dodawać nowe pakiety w miarę dodawania informacji tutaj.

Jim Wolff
źródło
0

Trudno jest uzyskać wszystkie wartości rejestru dla VC 2012, więc napisałem małą funkcję, która przejdzie przez wszystkie zależności i dopasuje do określonej wersji.

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;
}

Zależności:

using System.Text.RegularExpressions;
using Microsoft.Win32;
using System.Linq;
ssamko
źródło
-5

możesz szukać w rejestrze. Właściwie nie mam vs2012, ale mam vs2010.

Istnieją 3 różne (ale bardzo podobne) klucze rejestru dla każdego z 3 pakietów platformy. Każdy klucz ma wartość DWORD o nazwie „Zainstalowany” i wartość 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

Możesz użyć do tego funkcji rejestru ......

Vikky
źródło
1
Napisałem to w pierwszej linijce „Że nie mam VS2012”. Więc nie ma potrzeby komentowania tego ............. A to było tylko dla vs2010
vikky
1
Zauważyłeś to, ale wydawało się, że sugerujesz, że twoje rozwiązanie może działać również dla VS2012, ponieważ to było pytanie OP (ale nie mogłeś zweryfikować, ponieważ nie masz VS2012). Po prostu stwierdziłem, że to podejście w rzeczywistości nie działa z VS2012, odkąd go sprawdziłem.
StellarEleven
Dlaczego odrzucam moją odpowiedź ...... Napisałem jasno, że jest to dla vs2012 ... i to jest akceptowane jako odpowiedź przez użytkownika .... więc dlaczego ???????????
vikky
1
Wygląda na to, że w 64-bitowym systemie operacyjnym ta wartość znajduje się naHKLM\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\10.0\VC\VCRedist\...
bas
1
Klucze VS 2012 to HKLM \ SOFTWARE \ Microsoft \ VisualStudio \ 11.0 \ VC \ RunTimes ____ HKLM \ SOFTWARE \ Wow6432Node \ Microsoft \ VisualStudio \ 11.0 \ VC \ RunTimes ___
Adam L