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!
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!
Odpowiedzi:
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ę .:
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
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
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
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.1
dla plików binarnych ATL i MFC oraz 11.0.51106.1
dla wszystkiego innego, np. msvcp110.dll i 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
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
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
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
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.27702
i 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.6161
zgodnie 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.
[HKEY_CLASSES_ROOT\Installer\Dependencies\,,x86,14.0,bundle\Dependents\{$GUID}
i[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]
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).
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\DevDiv\VC\Servicing\11.0\RuntimeMinimum
Możesz sprawdzić, czy Installed
wartość znajduje się 1
w tej lokalizacji rejestru: HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\11.0\VC\Runtimes\x86
w 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
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\11.0\VC
ale nie mam Runtimes
klucza. Mam klucz w odpowiedzi Dave'a HKLM\SOFTWARE\Microsoft\DevDiv\VC\Servicing\11.0
.
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%'"
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.
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).
11.0.61030.0
) VC ++ 2012, mają wersję 11.0.60610.1
dla plików binarnych ATL i MFC, a także 11.0.51106.1
dla 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_x86
i C:\ProgramData\Package Cache\{B175520C-86A2-35A7-8619-86DC379688B9}v11.0.61030\packages\vcRuntimeAdditional_x86
sprawdzając pliki w plikach .cab.
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
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).
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.
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
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_VERSION
jeśli #include <crtversion.h>
- w ten sposób można określić, obliczyć wersji CRT, że został zbudowany z binarnym.
Ten kod PowerShell powinien załatwić sprawę
Get-ItemProperty
HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* |
Select-Object DisplayName, DisplayVersion, Publisher, InstallDate |
Format-Table –AutoSize
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.
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.
Większość ludzi tęskni za koniecznością /reg:32
sprawdzenia 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
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 $redistInfo
któ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.
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;
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 ......
HKLM\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\10.0\VC\VCRedist\...