Rileva se è installato Visual C ++ Redistributable per Visual Studio 2012


109

Come rilevare se è installato Visual C ++ Redistributable per Visual Studio 2012?

Ho provato su Google e nessuno mi ha fatto questa domanda, sorpresa!


1
Perché non rimuovere quella dipendenza impostando la libreria Runtime in C ++> Generazione codice su Multi-thread [debug] invece di Multi-thread [debug] dll? Ho appena risolto un problema di installazione ridistribuzione runtime rimuovendo semplicemente la dipendenza.
Cem Kalyoncu

Ho scoperto come rilevare i pacchetti per tentativi ed errori. Vorrei che ci fosse un proiettile magico, ma se c'è, non l'ho ancora trovato. Ho una risposta in basso per alcuni redist specifici che sembrano funzionare il 100% delle volte per aiutare con la maggior parte di essi attualmente .
kayleeFrye_onDeck

3
Si prega di considerare di cambiare la risposta accettata a quella di kayleeFrye_onDeck. Ho passato anni a cercare un metodo affidabile e questo sembra essere l'unico, penso che con tutte le altre risposte inaffidabili aiuterà molte persone a trovare le informazioni giuste
musefan

Sembra esserci un aggiornamento per i runtime di Visual Studio 2017: 14.10.V25017. Link: go.microsoft.com/fwlink/?LinkId=746572 Potresti aggiornare i valori del registro?
karel vergauwe

Risposte:


172

Dipende dalla versione che stai usando. Queste due chiavi 2012 hanno funzionato bene per me con le loro versioni corrispondenti da scaricare per l'aggiornamento 4. Tieni presente che alcune di queste posizioni dei reg potrebbero dipendere dal sistema operativo. Ho raccolto queste informazioni da una scatola di Windows 10 x64 . Andrò avanti e scaricherò tutte queste versioni redist e le chiavi di registro che cerco per rilevare l'installazione .:


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 di download diretto: 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 di download diretto: 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 di download diretto: 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 di download diretto: 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 di download diretto: 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 di download diretto: 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 di download diretto: 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 di download diretto: https://download.microsoft.com/download/1/6/B/16B06F60-3B20-4FF2-B699-5E9B7962F9AE/VSU_4/vcredist_x86.exe

avvertenza sulla versione : secondoi risultati di Wai Ha Lee , "... i binari forniti con l'aggiornamento 4 di VC ++ 2012 (11.0.61030.0 ) hanno la versione 11.0.60610.1per i binari ATL e MFC e 11.0.51106.1per tutto il resto, ad esempio msvcp110.dll e 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 di download diretto: 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 di download diretto: https://download.microsoft.com/download/2/E/6/2E61CFA4-993B-4DD4-91DA-3737CD5CD6E3/vcredist_x86.exe


Visual C ++ 2015

Prendi in considerazione l'utilizzo del pacchetto 2015-2019 come alternativa

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 di download diretto: 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 di download diretto: https://download.microsoft.com/download/6/A/A/6AA4EDFF-645B-48C5-81CC-ED5963AEAD48/vc_redist.x86.exe


Visual C ++ 2017

Prendi in considerazione l'utilizzo del pacchetto 2015-2019 come alternativa

Avvertimento : è in uso una nuova convenzione del registro del 2017 o non è stata ancora finalizzata. Come immagino i tasti più in alto di: [HKEY_CLASSES_ROOT\Installer\Dependencies\,,amd64,14.0,bundle] e [HKEY_CLASSES_ROOT\Installer\Dependencies\,,x86,14.0,bundle]

sono soggetti a modifiche, o almeno hanno GUID nidificati diversi, userò l'elenco della chiave che termina con un 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 di download diretto: 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 di download diretto: https://download.visualstudio.microsoft.com/download/pr/d0b808a8-aa78-4250-8e54-49b8c23f7328/9c5e6532055786367ee61aafb3313c95/vc_redist.x86.exe


Visual C ++ 2019 ( pacchetto 2015-2019 )

Avvertenza : c'è un'altra nuova convenzione del registro utilizzata per Visual C ++ 2019. Inoltre non sembra esserci un programma di installazione autonomo per Visual C ++ 2019, solo questo programma di installazione in bundle che è Visual C ++ dal 2015 al 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 di download diretto: 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 di download diretto: 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 di download diretto: 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 di download diretto: https://download.visualstudio.microsoft.com/download/pr/cc0046d4-e7b4-45a1-bd46-b1c079191224/9c4042a4c2e6d1f661f4c58cf4d129e9/vc_redist.x64.exe


Changelog :
19 agosto 2019 - Aggiunta una nuova versione della versione bundle 2015-2019
13 giugno 2019 - Aggiunta una nuova sezione per la versione bundle 2015-2019 14.21.27702e aggiunte piccole note alle sezioni 2015 e 2017 sulla considerazione dell'utilizzo di il nuovo bundle in alternativa.
14 dicembre 2018 - Aggiornato MSVC2008 per l' 9.0.30729.6161aggiornamento del Service Pack 1 in base ai risultati di Jim Wolff
27 novembre 2018 - Informazioni aggiornate per MSVC2017 v. 16 maggio 2018 - Aggiornata la versione 2017 per 14.14.26405.0 come nuova voce C ++ 2017 l'8 settembre , 2017 - Versione aggiornata del 2017 per 14.11.25325.0 come nuova voce di Visual C ++ 201714.16
12 settembre 2018 - Aggiunta avvertenza sulla versione all'aggiornamento 4 2012 in base alle scoperte di Wai Ha Lee
il 24 agosto, 2018: versione aggiornata del 2017 per 14.15.26706, le dipendenze di Visual C ++ aggiornate incluse nel pacchetto VS 2017 15.8.1


7 aprile 2017 - Versione 2017 aggiornata 14.10 .25008.0 come nuova voce di Visual C ++ 2017
24 ottobre 2016 - Informazioni sulla versione 2015 aggiornate per 14.0.24215.1
18 agosto 2016 - Informazioni sulla versione 2015 aggiornate per 14.0.24212
27 maggio 2016 - Informazioni aggiornate per MSVC2015 Update 2

Per favore contattami qui se qualcuno di questi diventa obsoleto.


4
Questo è perfetto. Questo è l'unico che ho trovato che non fornisce falsi positivi quando Visual Studio è installato o il runtime viene disinstallato.
AN

2
Il GUID di VS2015 Pre Update 1 è {74d0e5db-b326-4dae-a6b2-445b9de1836e}, quindi puoi entrare in confusione con l'utilizzo di questo meccanismo. Per ogni futuro aggiornamento! L'avvio del pre Update 1 VCRedist con Update 1 installato mi ha dato un errore, quindi userò la chiave di registrazione del programma di installazione VC, che sembra andare bene se usi VCRedist?
GilesDMiddleton

4
sfortunatamente questo non contiene VCREDIST 14.0 Update 2 - come gestiamo la compatibilità con le versioni successive (rilevando versioni più recenti e successive dello stesso runtime)
Shaun Wilson

2
@ManjunathBabu, non credo che ci sia alcuna documentazione esterna riguardante le convenzioni di registro per gli installatori ridistribuibili di Visual C ++. Ho appena notato che sembravano effettivamente seguire qualcosa di simile a uno schema questa volta per il 2017, invece di lanciare un altro GUID da qualche parte senza un nome chiave genitore significativo. Finora, hanno utilizzato queste posizioni per tutti i programmi di installazione rilasciati per il 2017: [HKEY_CLASSES_ROOT\Installer\Dependencies\,,x86,14.0,bundle\Dependents\{$GUID}e[HKEY_CLASSES_ROOT\Installer\Dependencies\,,amd64,14.0,bundle\Dependents\{$GUID}
kayleeFrye_onDeck

2
Il nuovo pacchetto di Visual C ++ 2017 modifica il percorso del registro (versione 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

Provare

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

come punto di partenza. Lo userò come controllo per l'installazione del runtime VC ++ 11 (VS 2012).


7
HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ DevDiv \ vc \ Servicing \ 11.0 \ RuntimeMinimum \ Install dovrebbe essere impostato su 1
Alex Spence

3
Per 32 bit (aka x86) la chiave si trova in:HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\DevDiv\VC\Servicing\11.0\RuntimeMinimum
CodeFox

@kayleeFrye_onDeck hai scoperto come farlo? Sto ancora cercando un modo affidabile, ma nessuna delle risposte in questa pagina ha funzionato per me
AN

Risposta migliore di quella accettata in quanto non si basa sull'UUID del pacchetto, che probabilmente cambierà per ogni patch fornita da Microsoft
jpo38

25

È possibile verificare che il Installedvalore si trovi 1in questa posizione del registro: HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\11.0\VC\Runtimes\x86su sistemi a 64 bit. Nel codice che comporterebbe l'accesso alla chiave di registro HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\11.0\VC\Runtimes\x86. Notare l'assenza diWow6432Node .

Su un sistema a 32 bit il registro è lo stesso senza Wow6432Node:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\11.0\VC\Runtimes\x86


Ho una macchina Win7 a 32 bit con il runtime 2012 VC ++ installato e non ho questa chiave reg.
BryanJ

Sei sicuro di non avere "HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ VisualStudio \ 11.0 \ VC`? Cosa hai?
Mike de Klerk

2
Ho HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\11.0\VCma non ho la Runtimeschiave. Ho la chiave nella risposta di Dave HKLM\SOFTWARE\Microsoft\DevDiv\VC\Servicing\11.0.
BryanJ

@BryanJ Strano che ogni sistema possa essere così diverso ... Grazie per aver aggiunto queste utili informazioni
Mike de Klerk

3
Storia divertente e nessuna informazione reale dalla SM. Penso che tu abbia la migliore risposta che ho trovato finora. Testato per installare vcredist su una VM relativamente fresca e questa è l'unica chiave che ho trovato in seguito. Quindi pollice su dal mio fianco ...
anhoppe

12

Non è presente alcun elemento installcheck nel manifesto del pacchetto del programma di avvio automatico fornito con Visual C ++. Immagino che Microsoft voglia sempre installarlo se lo imposti come prerequisito.

Ovviamente puoi ancora chiamare MsiQueryProductState per verificare se il pacchetto di redist VC è installato tramite MSI, Il codice del pacchetto può essere trovato eseguendo

wmic product get

dalla riga di comando, o se sei già in wmic: root \ cli, esegui

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

10

La risposta a queste semplici domande purtroppo non è semplice, ma funziona nel 100% di tutti i sistemi, ed è anche estendibile ai numerosi framework .net.

La complessità deriva dal fatto che ci sono (e c'erano) molte revisioni dei runtime VC che potrebbero portare al caso in cui, sebbene fossero installati i runtime VC10, il loro numero di build non era abbastanza recente, quindi il tuo EXE non si avviava a meno che tu non abbia installato proprio runtime esatti richiesti o uno dei runtime più recenti che consentono a questa e alle versioni precedenti della stessa versione principale di funzionare con esso (l'inferno side-by-side). Inoltre, se hai un EXE a 64 bit, dovrai controllare entrambi i tempi di esecuzione a 32 E 64 bit.

Detto questo, l'unico modo affidabile per determinare se i runtime per il tuo EXE sono installati è tentare di eseguire l'EXE o un altro EXE creato con le stesse impostazioni dell'EXE principale e il cui unico scopo è non fare nulla. Esegui semplicemente (il che significa che i runtime sono installati) o non riesci a eseguire (se non installato).

Ho fatto quanto segue per un programma di installazione che richiedeva l'installazione dei runtime VC10 a 32 e 64 bit: Il programma di installazione tenta di avviare tutti gli EXE fittizi e, se riesce, il runtime corrispondente viene considerato installato. Questo risolve anche lo scenario a 32/64 bit.

Questo, a proposito, funziona anche per determinare se è installato il framework .net corretto, il che è molto complicato in Windows 8 e 10, poiché il supporto .net 3.5 integrato scaricabile supporta anche le versioni .net 3.0 e 2.0 - lì non sono voci di registro per questi. (E peggio, non puoi nemmeno usare i programmi di installazione del framework standard qui, devi usare il supporto integrato e scaricarlo tramite Windows o ricostruire la tua app con .net 4, ma questa è un'altra storia).

L'EXE fittizio C ++ può essere creato utilizzando un progetto con il seguente codice (e un altro in una configurazione a 64 bit se necessario):

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

Ricordarsi di impostare le proprietà del progetto Use of MFC su utilizzare MFC in una DLL condivisa . Gli eseguibili avranno una dimensione di circa 4 KB, un piccolo prezzo da pagare per un risultato sicuro.

Per offrire ai tuoi utenti una bella esperienza di installazione, potresti fare quanto segue (il codice di esempio è per NSIS ):

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

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

e chiamarlo in una funzione, ad esempio 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

Quindi lanciare il controllo di runtime, ad esempio quando si lascia il Benvenuto pagina di e memorizza nella cache il risultato, in modo da non dover ricontrollare ogni volta che l'utente fa clic sui pulsanti "Indietro" e "Avanti".

Quindi, crea una sezione di sola lettura nell'albero di installazione e preselezionala o deselezionala su una funzione che viene eseguita prima dei componenti venga visualizzata la pagina .

Ciò assicurerà che l'installazione di ogni componente runtime mancante sia obbligatoria e che venga saltata se è già presente.


Grazie per il suggerimento utile, ricordi che tipo di progetto deve essere creato? VS ne ha moltissimi tra cui scegliere :-).
greenoldman

9

Poiché Visual Studio 2010 e versioni successive hanno smesso di utilizzare WinSxS, potrebbe essere sufficiente verificare la presenza di% windir% \ system32 \ msvcr110.dll. Se vuoi verificare di avere una versione abbastanza nuova, puoi controllare se la versione del file è 11.0.50727.1 (VS2012 RTM) o 11.0.51106.1 (VS2012 Update 1).


+1 questo è più semplice e più sicuro. Le chiavi di registro vanno bene e così, ma se l'utente ha modificato il sistema e ha eliminato msvcr110.dll, il controllo del registro è inutile. Tuttavia, è meglio controllare tutti i componenti necessari (msvcr110.dll, msvcp110.dll, mfc, ...). E per l'aggiornamento 3 la versione è 11.0.60610.1.
stijn

ok ignora l'ultimo bit: sembra che solo l'installer sia 11.0.60610.1, la versione delle dll crt è ancora 11.0.51106.1
stijn

ya .dll è 11.0.51106.1 anche se ho installato vs2012 sp4
Blub

Questo non funzionerà. Ho disinstallato il 2005-2015 e ho ancora file msvc per 60, 100, 110, 120 e 140 lì.
kayleeFrye_onDeck

Tieni presente che i file binari forniti con VC ++ 2012 update 4 ( 11.0.61030.0) hanno la versione 11.0.60610.1per i binari ATL e MFC e 11.0.51106.1per tutto il resto, ad esempio msvcp110.dll e msvcr110.dll. Non so perché. Puoi confermarlo (sulle macchine Windows 10 su cui l'ho testato) andando su C:\ProgramData\Package Cache\{BD95A8CD-1D9F-35AD-981A-3E7925026EBB}v11.0.61030\packages\vcRuntimeMinimum_x86e C:\ProgramData\Package Cache\{B175520C-86A2-35A7-8619-86DC379688B9}v11.0.61030\packages\vcRuntimeAdditional_x86controllando i file nei file .cab.
Wai Ha Lee

5

Mi sono imbattuto in questa domanda cercando una risposta nel contesto del controllo del ridistribuibile di Visual C ++ come parte di un programma di installazione MSI creato da WiX.

Non mi è piaciuto il modo in cui il GUID cambia con la versione e il sistema operativo, quindi ho finito per creare un'azione personalizzata scritta in C # per verificare la ridistribuibilità di Visual C ++.

Tutto ciò che segue è specifico per Visual C ++ 2015 Redistributable (x64), ma può essere facilmente modificato per qualsiasi versione.

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

Quindi nel file 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>

Modifica Sto aggiornando questa risposta con alcune informazioni di base sulla creazione e l'utilizzo di un'azione personalizzata.

Per creare l'azione personalizzata in Visual Studio 2017 con l'estensione WiX Toolset Visual Studio 2017 installata, ho utilizzato il modello di progetto per creare un'azione personalizzata (C # Custom Action Project per WiX v3).

Ho controllato il progetto generato e sembrava che le modifiche fossero già elencate all'inizio di questo articolo: https://www.codeproject.com/Articles/132918/Creating-Custom-Action-for-WIX-Written-in-Managed così ho preso quell'articolo nella sezioneAdding Custom Action to the Installer e l'ho seguito con alcune modifiche.

Un'altra cosa che ho fatto è stata cambiare la versione del framework .NET su cui è costruito il progetto alla 3.5.

Non l'ho trovato molto utile ma puoi anche vedere http://wixtoolset.org/documentation/manual/v3/wixdev/extensions/authoring_custom_actions.html


4

Per me questa posizione ha funzionato: HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ DevDiv \ vc \ Servicing \ 11.0 \ RuntimeMinimum \ Version

Controlla quale versione hai dopo aver installato il pacchetto e usala come condizione nel tuo programma di installazione. (il mio è impostato su 11.0.50727 dopo l'installazione di VCred).


Questa risposta è esattamente ciò che stavamo cercando (rispetto ad altre risposte qui, che riguardano meno il runtime e più su Visual Studio, purtroppo.)
Shaun Wilson

Questa risposta non funziona, poiché questa chiave esiste dopo aver disinstallato i redist.
kayleeFrye_onDeck

4

Vai su Pannello di controllo> Programmi e funzionalità e vengono visualizzati tutti nell'elenco.

Non sono un esperto e questa risposta è piuttosto semplice rispetto a ciò che rispondono le persone (controllando il registro), quindi non sono sicuro che sia la risposta corretta, ma ha fatto il trucco per me.

Programmi e caratteristiche


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

Ci sono riuscito con InnoSetup.

Ho verificato l'esistenza della chiave di registro:

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

Se disinstallato, non esiste. Se installato, esiste.

A proposito, potrebbe anche essere nel Wow6432Node:

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


Questo non è vero. Le chiavi esistono in entrambe le posizioni quando sono state disinstallate.
kayleeFrye_onDeck

1
@kayleeFrye_onDeck Sì ... devo essere d'accordo con te. Ma in effetti, quando l'ho provato per la prima volta, ha avuto successo. Ma recentemente è come hai detto tu. Non so perché sia ​​così.
Fandi Susanto

3

Il controllo dello stato di installazione del prodotto tramite MsiQueryProductState è praticamente equivalente al controllo diretto del registro, ma è comunque necessario il GUID per ProductCode .

Come accennato altrove, uno svantaggio di questi approcci è che ogni aggiornamento ha il proprio ProductCode!

Per fortuna, MSI fornisce un UpgradeCode che identifica una "famiglia" di prodotti. Puoi usare orca per aprire uno degli MSI per estrarre queste informazioni. Ad esempio, l'UpgradeCode per il ridistribuibile di VS2015 è{65E5BD06-6392-3027-8C26-853107D3CF1A}

È possibile utilizzare MsiEnumRelatedProducts per ottenere tutti gli ID prodotto per tale UpgradeCode. In pratica, poiché ogni aggiornamento di ridistribuzione sostituisce quello precedente, questo produrrà solo un ProductCode, come {B5FC62F5-A367-37A5-9FD2-A6E137C0096F}per VS2015 Update 2 x86.

Indipendentemente da ciò, puoi quindi controllare la versione tramite MsiGetProductInfo (productCode, INSTALLPROPERTY_VERSIONSTRING, ...) o funzioni simili per confrontarla con la versione che desideri, ad esempio per verificare una versione equivalente o successiva.

Si noti che all'interno di un'applicazione C ++, è anche possibile utilizzare _VC_CRT_MAJOR_VERSION, _VC_CRT_MINOR_VERSION, _VC_CRT_BUILD_VERSIONse #include <crtversion.h>- in questo modo è possibile determinare calcolare la versione CRT che il binario è stato costruito con.


Come hai ottenuto queste informazioni? Ed è questo l'UpgradeCode per la versione x86 o per la versione x64?
Ben Key

Puoi usare Orca per aprire il file msi ed estrarre l'UpgradeCode. Quella fornita qui è almeno per x86. Per quanto riguarda dove ho ottenuto il resto delle informazioni, questa è praticamente la fonte primaria; Non sono riuscito a trovare altri riferimenti a questo approccio online per quanto riguarda specificamente il redist, ma il modello UpgradeCode / family è comune con gli installatori MSI.
adzm

Conosco Orca. Il problema ha a che fare con il raggiungimento di quel MSI. Non conosco un modo per accedervi direttamente. L'unico modo che conosco è trovarlo in qualche modo nella directory c: \ Windows \ Installer. Ho oltre 1.000 file in quella directory. I file vengono denominati in modo casuale. L'unico modo per determinare quale MSI è corretto è guardare la descrizione. Ciò implica premere Alt + Invio su 1.000 file in Esplora risorse o utilizzare uno strumento per scaricare le descrizioni di 1.000 file.
Ben Key

Ah! Capisco. Puoi anche cercare nel registro per trovare il percorso o anche il codice di aggiornamento se conosci il codice del prodotto, all'interno di HKLM \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Installer \ UpgradeCodes. Tuttavia potrebbe essere necessario utilizzare WMIC (o qualche altro accesso programmatico al database msi) per capire il resto. get / format del prodotto wmic: csv scaricherà un file csv che puoi cercare - ha i percorsi msi nei valori restituiti. Potresti scrivere una sceneggiatura migliore, ne sono sicuro, ma dovrebbe essere sufficiente per farti strada.
adzm

3

Questo codice PowerShell dovrebbe fare il trucco

Get-ItemProperty
HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* | 
Select-Object DisplayName, DisplayVersion, Publisher, InstallDate |
Format-Table AutoSize

poiché l'hardcoding di un mucchio di codici prodotto non avrebbe funzionato, anche noi enumeriamo il registro controllando il "nome prodotto" di ogni voce con un'espressione regolare, quindi controlliamo VersionMajor / VersionMinor (che è tutto ciò a cui teniamo veramente) questo ha il valore di permetterci di produrre una singola build e sapere che continuerà a funzionare per tutta la durata di servizio di una data versione di vcredist. l'intento qui è perfetto, ma potrebbe richiedere la traslitterazione per set di strumenti come NSIS o programmi di installazione basati su WinAPI.
Shaun Wilson

2

Avevo bisogno della stessa cosa e, sebbene AFAIK questo non possa essere fatto a livello di programmazione, ha funzionato per me.

Sono appena andato su Start -> Disinstalla un programma e ho fatto scorrere verso il basso fino a trovare il ridistribuibile VC ++, che include un numero di versione. Cercando su Google il numero di versione, mi ha detto che appartiene a VS2012 SP1.


2

Vecchia domanda, ma ecco l'approccio che abbiamo utilizzato con successo da Visual Studio 2005. L'ho appena testato utilizzando anche Visual Studio 2012 Update 4 (dato che stiamo finalmente aggiornando il nostro software dal 2010 al 2012).

Poiché i pacchetti ridistribuibili di Visual C ++ registrano il loro programma di disinstallazione con Windows (quindi compare nell'elenco "Programmi e funzionalità" del pannello di controllo), controlliamo semplicemente il nome visualizzato della chiave di disinstallazione nel registro.

Ecco il codice NSIS pertinente:

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:

Si noti che poiché il nostro programma di installazione è un exe a 32 bit, Windows gestisce la determinazione se la chiave di registro è effettivamente nel Wow6432Node virtualizzato anziché nella posizione sopra, quindi il codice sopra funziona su entrambe le installazioni di Windows a 64 bit e 32 bit senza dover controllare esplicitamente entrambe le chiavi.

Si noti inoltre che per aggiornare il codice precedente a una versione diversa di VC ++ Redist, è sufficiente modificare il GUID nel percorso della chiave di registro e il nome visualizzato con quello che ti serve.

Anche se questo potrebbe non essere il metodo consigliato, negli ultimi 10 anni ha funzionato su oltre 10.000 macchine eseguendo ogni tipo di Windows da XP / XP64 a Windows 10 utilizzando le ridistribuzioni per 2005, 2010, 2010sp1 e ora 2012u4.


1

Controllerei il Installedvalore di

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

  • dove GUID di VC++ 2012 (x86)è{33d1fd90-4274-48a1-9bc1-97e33d9c2d6f}
  • WOW6432Nodesarà presente o meno a seconda del VC++ redistprodotto

0

Ciò che la maggior parte delle persone perde è la necessità /reg:32di verificare la chiave su Windows x64.

Vedere l' articolo della Guida di Microsoft su questo argomento.

Ecco uno script che dimostra come controllare correttamente Visual C ++ Redistributable per 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

0

La soluzione di script PowerShell:

Sulla base delle informazioni nella risposta di @kayleeFrye_onDeck

Ho creato uno script PowerShell che controlla e installa le versioni specificate dall'utente, non ho eseguito test approfonditi con esso, ma per il mio scenario CI (Continuous Integration) funziona perfettamente.

Lo script completo e le informazioni su GitHub

L'approccio che ho usato era basato sul controllo dei regkeys sulla base delle informazioni fornite qui. Quello che segue è il succo di ciò che fa lo script:

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

Il controllo / download / installazione silenziosa in base al $redistInfoquale contiene le informazioni compilate da 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
}

Lo script completo e ulteriori informazioni possono essere trovati su GitHub

Chiunque può contribuire, se ho tempo farò test più approfonditi dello script e continuerò a provare ad aggiungere nuovi pacchetti man mano che le informazioni vengono aggiunte qui.


0

È difficile ottenere tutti i valori di registro per VC 2012, quindi ho scritto una piccola funzione che eseguirà tutte le dipendenze e corrisponderà alla versione specificata.

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

dipendenze:

using System.Text.RegularExpressions;
using Microsoft.Win32;
using System.Linq;

-5

puoi cercare nel registro. In realtà non ho vs2012 ma ho vs2010.

Esistono 3 chiavi di registro diverse (ma molto simili) per ciascuno dei 3 pacchetti della piattaforma. Ogni chiave ha un valore DWORD chiamato "Installed" con un valore di 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

È possibile utilizzare la funzione di registro per questo ...


1
L'ho scritto nella prima riga "Che non ho VS2012". Quindi non c'è bisogno di commentare questo ............. E questo era solo per vs2010
vikky

1
L'hai notato, ma sembrava che tu stessi suggerendo che la tua soluzione potrebbe funzionare anche per VS2012 poiché quella era la domanda dell'OP (ma non è stato possibile verificare poiché non hai VS2012). Stavo semplicemente affermando che questo approccio, in effetti, non funziona con VS2012 da quando l'ho verificato.
StellarEleven

Perché votare giù la mia risposta ...... ho scritto chiaramente che è per vs2012 ... e questa è accettata come risposta dall'utente .... quindi perché ???????????
vikky

1
Sembra che con un sistema operativo x64 bit questo valore si trovi aHKLM\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\10.0\VC\VCRedist\...
bas

1
Le chiavi VS 2012 sono HKLM \ SOFTWARE \ Microsoft \ VisualStudio \ 11.0 \ VC \ RunTimes ____ HKLM \ SOFTWARE \ Wow6432Node \ Microsoft \ VisualStudio \ 11.0 \ VC \ RunTimes ___
Adam L
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.