Detectar si Visual C ++ Redistributable para Visual Studio 2012 está instalado

109

¿Cómo detectar si Visual C ++ Redistributable para Visual Studio 2012 está instalado?

Probé Google y nadie ha hecho esta pregunta, ¡sorpresa!

sean717
fuente
1
¿Por qué no eliminar esa dependencia configurando la biblioteca en tiempo de ejecución en C ++> Generación de código en [depuración] multiproceso en lugar de dll [depuración] multiproceso? Acabo de resolver un problema de instalación de redistribución en tiempo de ejecución simplemente eliminando la dependencia.
Cem Kalyoncu
Descubrí cómo detectar paquetes por ensayo y error. Ojalá hubiera una fórmula mágica, pero si la hay, todavía no la he encontrado. Tengo una baja respuesta a continuación para algunos redists específicas que parecen funcionar el 100% del tiempo para ayudar con la actualidad la mayoría de ellos.
kayleeFrye_onDeck
3
Considere cambiar la respuesta aceptada a la de kayleeFrye_onDeck. He pasado años buscando un método confiable y este parece ser el indicado, creo que con todas las otras respuestas poco confiables ayudará a mucha gente a encontrar la información correcta
musefan
Parece haber una actualización para los tiempos de ejecución de Visual Studio 2017: 14.10.V25017. Enlace: go.microsoft.com/fwlink/?LinkId=746572 ¿Podría actualizar los valores del registro?
karel vergauwe

Respuestas:

172

Depende de la versión que esté utilizando. Estas dos claves de 2012 me han funcionado bien con sus versiones correspondientes para descargar para la Actualización 4. Tenga en cuenta que algunas de estas ubicaciones de registro pueden depender del sistema operativo. Recopilé esta información de una caja de Windows 10 x64 . Solo voy a seguir adelante y volcar todas estas versiones redist y las claves de registro que busco para detectar la instalación:


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

advertencia sobre la versión : Segúnlos hallazgos delusuario Wai Ha Lee , "... los binarios que vienen con la actualización 4 ( 11.0.61030.0) de VC ++ 2012 tienen versión 11.0.60610.1para los binarios ATL y MFC, y 11.0.51106.1para todo lo demás, por ejemplo, msvcp110.dll y 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 de descarga directa: 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 de descarga directa: https://download.microsoft.com/download/2/E/6/2E61CFA4-993B-4DD4-91DA-3737CD5CD6E3/vcredist_x86.exe


Visual C ++ 2015

Considere usar el paquete 2015-2019 como 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 de descarga directa: 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 de descarga directa: https://download.microsoft.com/download/6/A/A/6AA4EDFF-645B-48C5-81CC-ED5963AEAD48/vc_redist.x86.exe


Visual C ++ 2017

Considere usar el paquete 2015-2019 como alternativa

Advertencia : se está utilizando una nueva convención de registro de 2017 o aún no se ha finalizado. Como supongo, las teclas más altas de: [HKEY_CLASSES_ROOT\Installer\Dependencies\,,amd64,14.0,bundle] y [HKEY_CLASSES_ROOT\Installer\Dependencies\,,x86,14.0,bundle]

están sujetos a cambios, o al menos tienen diferentes GUID anidados, voy a usar list la clave que 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 de descarga directa: 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 de descarga directa: https://download.visualstudio.microsoft.com/download/pr/d0b808a8-aa78-4250-8e54-49b8c23f7328/9c5e6532055786367ee61aafb3313c95/vc_redist.x86.exe


Visual C ++ 2019 ( paquete 2015-2019 )

Consideración : se está utilizando otra nueva convención de registro para Visual C ++ 2019. Tampoco parece haber un instalador independiente para Visual C ++ 2019, solo este instalador de paquete que es Visual C ++ 2015 a 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 de descarga directa: 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 de descarga directa: 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 de descarga directa: 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 de descarga directa: https://download.visualstudio.microsoft.com/download/pr/cc0046d4-e7b4-45a1-bd46-b1c079191224/9c4042a4c2e6d1f661f4c58cf4d129e9/vc_redist.x64.exe


Registro de cambios :
19 de agosto de 2019 - Se agregó una nueva versión de la versión del paquete 2015-2019
13 de junio de 2019 - Se agregó una nueva sección para la versión del paquete 2015-2019 14.21.27702y se agregaron pequeñas notas a las secciones de 2015 y 2017 sobre la consideración del uso de el nuevo paquete como alternativa.
14 de diciembre de 2018 - MSVC2008 actualizado para la 9.0.30729.6161actualización del Service Pack 1 según los hallazgos de Jim Wolff
27 de noviembre de 2018 - Información actualizada para MSVC2017 v. 14.16
12 de septiembre de 2018 - Advertencia de versión agregada a la Actualización 4 de 2012 según los hallazgos de Wai Ha Lee
24 de agosto, 2018: versión de 2017 actualizada para 14.15.26706, las dependencias de Visual C ++ actualizadas empaquetadas con VS 2017 15.8.1
16 de mayo de 2018 - Versión de 2017 actualizada para 14.14.26405.0 como la nueva entrada de C ++ 2017
8 de septiembre de 2017 - Versión de 2017 actualizada para 14.11.25325.0 como la nueva entrada de Visual C ++ 2017
7 de abril de 2017 - Versión de 2017 actualizada de 14.10 .25008.0 como la nueva entrada de Visual C ++ 2017
24 de octubre de 2016 - Información de versión de 2015 actualizada para 14.0.24215.1
18 de agosto de 2016 - Información de versión de 2015 actualizada para 14.0.24212
27 de mayo de 2016 - Información actualizada de MSVC2015 Update 2

Por favor contácteme aquí si alguno de estos queda desactualizado.

kayleeFrye_onDeck
fuente
4
Esto es perfecto. Este es el único que he encontrado que no da falsos positivos cuando se instala Visual Studio o se desinstala el tiempo de ejecución.
AN
2
El GUID de VS2015 Pre Update 1 es {74d0e5db-b326-4dae-a6b2-445b9de1836e} por lo que puede meterse en un lío con el uso de este mecanismo. ¡Para cada actualización futura! Al iniciar el VCRedist anterior a la Actualización 1 con la Actualización 1 instalada me dio un error, así que voy a usar la clave de registro del instalador de VC, que parece estar bien si usa VCRedist.
GilesDMiddleton
4
Desafortunadamente, esto no contiene VCREDIST 14.0 Actualización 2 - ¿Cómo manejamos la compatibilidad hacia adelante (detectando versiones posteriores y más nuevas del mismo tiempo de ejecución)?
Shaun Wilson
2
@ManjunathBabu, no creo que haya ninguna documentación externa sobre las convenciones de registro para los instaladores redistribuibles de Visual C ++. Acabo de notar que en realidad parecían seguir algo parecido a un esquema esta vez para 2017, en lugar de simplemente lanzar otro GUID en algún lugar sin un nombre de clave principal significativo. Hasta ahora, han utilizado estas ubicaciones para todos los instaladores lanzados para 2017: [HKEY_CLASSES_ROOT\Installer\Dependencies\,,x86,14.0,bundle\Dependents\{$GUID}y[HKEY_CLASSES_ROOT\Installer\Dependencies\,,amd64,14.0,bundle\Dependents\{$GUID}
kayleeFrye_onDeck
2
El nuevo paquete de Visual C ++ 2017 cambia la ruta del registro (Versión 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

Tratar

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

como punto de partida. Usaré esto como verificación para instalar el tiempo de ejecución de VC ++ 11 (VS 2012).

Dave Dawkins
fuente
7
HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ DevDiv \ vc \ Servicing \ 11.0 \ RuntimeMinimum \ Install debe establecerse en 1
Alex Spence
3
Para 32 bits (también conocido como x86), la clave se encuentra en:HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\DevDiv\VC\Servicing\11.0\RuntimeMinimum
CodeFox
@kayleeFrye_onDeck, ¿has encontrado cómo hacer esto? Todavía estoy buscando una forma confiable también, pero ninguna de las respuestas en esta página me ha funcionado
AN
Mejor respuesta que la aceptada, ya que no depende del UUID del paquete, y es probable que cambie con cada parche que proporcione Microsoft
jpo38
25

Puede verificar que el Installedvalor esté 1en esta ubicación de registro: HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\11.0\VC\Runtimes\x86en sistemas de 64 bits. En código que resultaría en el acceso a la clave de registro HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\11.0\VC\Runtimes\x86. Note la ausencia deWow6432Node .

En un sistema de 32 bits, el registro es el mismo sin Wow6432Node:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\11.0\VC\Runtimes\x86

Mike de Klerk
fuente
Tengo una máquina Win7 de 32 bits con el tiempo de ejecución de VC ++ 2012 instalado y no tengo esta clave de registro.
BryanJ
¿Está seguro de que no tiene `HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ VisualStudio \ 11.0 \ VC`? ¿Qué tienes?
Mike de Klerk
2
Tengo HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\11.0\VCpero no tengo la Runtimesllave. Tengo la clave en la respuesta de Dave HKLM\SOFTWARE\Microsoft\DevDiv\VC\Servicing\11.0.
BryanJ
@BryanJ Es extraño que cada sistema pueda ser tan diferente ... Gracias por agregar esta información útil
Mike de Klerk
3
Historia divertida y sin información real de MS. Creo que tienes la mejor respuesta que he encontrado hasta ahora. Probado para instalar vcredist en una máquina virtual relativamente nueva y esta es la única clave que encontré después. Así que pulgar hacia arriba de mi lado ...
anhoppe
12

No hay ningún elemento installcheck en el manifiesto del paquete bootstrapper enviado con Visual C ++. Supongo que Microsoft quiere instalar siempre si lo establece como un requisito previo.

Por supuesto, aún puede llamar a MsiQueryProductState para verificar si el paquete VC redist está instalado a través de MSI. El código del paquete se puede encontrar ejecutando

wmic product get

en la línea de comandos, o si ya está en wmic: root \ cli, ejecute

product where "Caption like '%C++ 2012%'"
Sheng Jiang 蒋 晟
fuente
10

Desafortunadamente, la respuesta a estas simples preguntas no es simple, sino que funciona en el 100% de todos los sistemas e incluso se puede ampliar a los numerosos marcos .net.

La complejidad proviene del hecho de que hay (y hubo) muchas revisiones de tiempos de ejecución de VC que podrían llevar al caso de que, aunque se instalaron tiempos de ejecución de VC10, su número de compilación no era lo suficientemente reciente, por lo que su EXE no se iniciaría a menos que instale el mismo tiempos de ejecución exactos que requirió o uno de los tiempos de ejecución más nuevos que permiten que esta y versiones anteriores para que la misma versión principal se ejecute con él (el infierno de lado a lado). Además, si tiene un EXE de 64 bits, deberá verificar los tiempos de ejecución de 32 Y 64 bits.

Dicho esto, la única forma confiable de determinar si los tiempos de ejecución de su EXE están instalados es intentar ejecutar el EXE , u otro EXE creado con la misma configuración que su EXE principal y cuyo único propósito es no hacer nada. Simplemente ejecute (lo que significa que los tiempos de ejecución están instalados) o no se ejecuten (cuando no estén instalados).

Hice lo siguiente para un instalador que requería los tiempos de ejecución VC10 de 32 y 64 bits instalados: El instalador intenta ejecutar todos los EXE ficticios y, si tiene éxito, se considera que el tiempo de ejecución correspondiente está instalado. Esto también resuelve el escenario de 32/64 bits.

Esto, por cierto, también funciona para determinar si está instalado el marco .net adecuado, lo cual es muy complicado en Windows 8 y 10, ya que el soporte .net 3.5 incorporado descargable también es compatible con las versiones .net 3.0 y 2.0. no hay entradas de registro para estos. (Y lo que es peor, ni siquiera puede utilizar los instaladores de framework estándar aquí, debe usar el soporte integrado y descargarlo a través de Windows, o reconstruir su aplicación con .net 4, pero esa es otra historia).

El EXE ficticio de C ++ se puede construir usando un proyecto con el siguiente código (y otro en una configuración de 64 bits si es necesario):

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

Recuerde establecer las propiedades del proyecto Uso de MFC para usar MFC en una DLL compartida . Los ejecutables tendrán un tamaño de alrededor de 4 KB, un pequeño precio a pagar por un resultado seguro.

Para brindarles a sus usuarios una experiencia de instalación agradable, puede hacer lo siguiente (el código de muestra es para NSIS ):

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

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

y llamarlo en una función, por ejemplo, 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

A continuación, inicie la verificación de tiempo de ejecución, por ejemplo, al salir de la página de bienvenida y almacene el resultado en caché, para que no tenga que volver a verificar cada vez que el usuario haga clic en el botón "Atrás" y "Siguiente".

A continuación, cree una sección de solo lectura en el árbol de instalación y preseleccione o anule la selección en la función que se ejecuta antes de que se muestre la página Componentes .

Esto garantizará que la instalación de cada componente de tiempo de ejecución faltante sea obligatoria y se omita si ya está presente.

Miguel
fuente
Gracias por un consejo útil, ¿recuerdas qué tipo de proyecto se debe crear? VS tiene una gran cantidad de ellos para elegir :-).
greenoldman
9

Dado que Visual Studio 2010 y versiones posteriores dejaron de usar WinSxS, puede ser suficiente con solo verificar% windir% \ system32 \ msvcr110.dll. Si desea verificar que tiene una versión lo suficientemente nueva, puede verificar si la versión del archivo es 11.0.50727.1 (VS2012 RTM) o 11.0.51106.1 (VS2012 Update 1).

BCran
fuente
+1 esto es más simple y más infalible. Las claves de registro están bien y tal, pero si el usuario se metió con el sistema y eliminó msvcr110.dll, la verificación del registro es inútil. Sin embargo, es mejor verificar todos los componentes que necesita (msvcr110.dll, msvcp110.dll, mfc, ...). Y para la actualización 3, la versión es 11.0.60610.1.
stijn
ok ignore el último bit: parece que solo el instalador es 11.0.60610.1, la versión de crt dlls sigue siendo 11.0.51106.1
stijn
ya, el .dll es 11.0.51106.1 a pesar de que tengo vs2012 sp4 instalado
Blub
Esto no funcionará. Desinstalé 2005-2015 y todavía tengo archivos msvc para 60, 100, 110, 120 y 140 allí.
kayleeFrye_onDeck
Tenga en cuenta que los binarios que vienen con la actualización 4 ( 11.0.61030.0) de VC ++ 2012 tienen la versión 11.0.60610.1para los binarios ATL y MFC, y 11.0.51106.1para todo lo demás, por ejemplo, msvcp110.dll y msvcr110.dll. No estoy seguro de por qué. Puede confirmar esto (en las máquinas con Windows 10 en las que lo he probado) yendo C:\ProgramData\Package Cache\{BD95A8CD-1D9F-35AD-981A-3E7925026EBB}v11.0.61030\packages\vcRuntimeMinimum_x86y C:\ProgramData\Package Cache\{B175520C-86A2-35A7-8619-86DC379688B9}v11.0.61030\packages\vcRuntimeAdditional_x86luego inspeccionando los archivos en los archivos .cab.
Wai Ha Lee
5

Me encontré con esta pregunta en busca de una respuesta en el contexto de la verificación del redistribuible de Visual C ++ como parte de un instalador de MSI creado por WiX.

No me gustó cómo cambia el GUID con la versión y el sistema operativo, así que terminé creando una acción personalizada escrita en C # para verificar el redistribuible de Visual C ++.

Todo lo que aparece a continuación es específicamente para Visual C ++ 2015 Redistributable (x64), pero se puede modificar fácilmente para cualquier versión.

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

Luego en el archivo 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>

Editar Estoy actualizando esta respuesta con información básica sobre cómo crear y usar una acción personalizada.

Para crear la acción personalizada en Visual Studio 2017 con la extensión WiX Toolset Visual Studio 2017 instalada, utilicé la plantilla de proyecto para crear una acción personalizada (Proyecto de acción personalizada de C # para WiX v3).

Revisé el proyecto generado y parecía que ya tenía los cambios enumerados al principio de este artículo: https://www.codeproject.com/Articles/132918/Creating-Custom-Action-for-WIX-Written-in-Managed así que recogí ese artículo en la secciónAdding Custom Action to the Installer y lo seguí con algunos ajustes.

Otra cosa que hice fue cambiar la versión del marco .NET contra el que se construyó el proyecto a 3.5.

No lo encontré realmente útil, pero también puedes ver http://wixtoolset.org/documentation/manual/v3/wixdev/extensions/authoring_custom_actions.html

TJ Rockefeller
fuente
4

Para mí, esta ubicación funcionó: HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ DevDiv \ vc \ Servicing \ 11.0 \ RuntimeMinimum \ Version

Verifique qué versión tiene después de instalar el paquete y utilícela como condición en su instalador. (el mío está configurado en 11.0.50727 después de instalar VCred).

atila
fuente
Esta respuesta es exactamente lo que estábamos buscando (en comparación con otras respuestas aquí, que son menos sobre el tiempo de ejecución y más sobre Visual Studio, desafortunadamente)
Shaun Wilson
Esta respuesta no funciona, ya que esta clave existe después de haber desinstalado las listas de redistribuidas.
kayleeFrye_onDeck
4

Simplemente vaya a Panel de control> Programas y características, y todos aparecerán enumerados allí.

No soy un experto y esta respuesta es bastante simple en comparación con lo que la gente está respondiendo (verificando el registro), así que no estoy seguro de si es la respuesta correcta, pero funcionó para mí.

Programas y características

Adrian Pauly
fuente
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
fuente
3

He logrado hacer esto con InnoSetup.

Verifiqué la existencia de la clave de registro:

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

Si se desinstala, no existe. Si está instalado, existe.

Por cierto, también podría estar en el Wow6432Node:

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

Fandi Susanto
fuente
Esto es falso. Las claves existen en ambas ubicaciones cuando se han desinstalado.
kayleeFrye_onDeck
1
@kayleeFrye_onDeck Sí ... debo estar de acuerdo contigo. Pero de hecho, cuando lo probé por primera vez, fue un éxito. Pero recientemente es como dijiste. No sé por qué es así.
Fandi Susanto
3

Verificar el estado de instalación del producto a través de MsiQueryProductState es prácticamente equivalente a verificar el registro directamente, pero aún necesita el GUID para ProductCode .

Como se mencionó en otra parte, un inconveniente de estos enfoques es que cada actualización tiene su propio ProductCode.

Afortunadamente, MSI proporciona un UpgradeCode que identifica una "familia" de productos. Puede usar orca para abrir uno de los MSI para extraer esta información. Por ejemplo, el UpgradeCode para el redistribuible de VS2015 es{65E5BD06-6392-3027-8C26-853107D3CF1A}

Puede usar MsiEnumRelatedProducts para obtener todos los ID de producto para ese UpgradeCode. En la práctica, dado que cada actualización de nueva lista reemplaza a la anterior, esto solo producirá un código de producto, como {B5FC62F5-A367-37A5-9FD2-A6E137C0096F}para VS2015 Update 2 x86.

Independientemente, puede verificar la versión a través de MsiGetProductInfo (productCode, INSTALLPROPERTY_VERSIONSTRING, ...) o funciones similares para comparar con la versión que desea, por ejemplo, para buscar una versión equivalente o posterior.

Tenga en cuenta que dentro de una aplicación C ++, también se puede utilizar _VC_CRT_MAJOR_VERSION, _VC_CRT_MINOR_VERSION, _VC_CRT_BUILD_VERSIONsi #include <crtversion.h>- de esta manera se puede determinar Calcular la versión CRT que su binario fue construido con.

adzm
fuente
¿Cómo obtuviste esta información? ¿Y ese es el UpgradeCode para la versión x86 o la versión x64?
Ben Key
Puede usar Orca para abrir el msi y extraer el UpgradeCode. El que se proporciona aquí es para x86 al menos. En cuanto a dónde obtuve el resto de la información, esta es prácticamente la fuente principal; No pude encontrar otras referencias a este enfoque en línea con respecto a la redistribución específicamente, pero el patrón UpgradeCode / family es común con los instaladores de MSI.
adzm
Soy consciente de Orca. El problema tiene que ver con llegar a ese MSI. No conozco una forma de acceder directamente. La única forma que conozco es encontrarlo de alguna manera en el directorio c: \ Windows \ Installer. Tengo más de 1,000 archivos en ese directorio. Los archivos se nombran al azar. La única forma de determinar qué MSI es correcto es mirar la descripción. Esto implica presionar Alt + Enter en 1,000 archivos en el explorador o usar una herramienta para volcar las descripciones de 1,000 archivos.
Ben Key
Ahh ya veo. También puede buscar en el registro para encontrar la ruta o incluso el código de actualización si conoce el código del producto, dentro de HKLM \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Installer \ UpgradeCodes. Sin embargo, es posible que deba usar WMIC (o algún otro acceso programático a msi db) para averiguar el resto. wmic product get / format: csv volcará un csv que puede buscar; tiene las rutas de msi en los valores devueltos. Estoy seguro de que podrías escribir un guión mejor, pero esto debería ser suficiente para seguir tu camino.
adzm
3

Este código de PowerShell debería funcionar

Get-ItemProperty
HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* | 
Select-Object DisplayName, DisplayVersion, Publisher, InstallDate |
Format-Table AutoSize
Ernie C
fuente
debido a que codificar un montón de códigos de producto no iba a funcionar, también enumeramos el registro verificando el "nombre del producto" de cada entrada con una expresión regular, luego verificamos VersionMajor / VersionMinor (que es todo lo que realmente nos importa) esto tiene el valor de permitirnos producir una sola compilación y saber que seguirá funcionando durante la vida útil de una determinada versión de vcredist. la intención aquí es acertada, pero puede requerir la transliteración para conjuntos de herramientas como NSIS o instaladores basados ​​en WinAPI.
Shaun Wilson
2

Necesitaba lo mismo, y aunque AFAIK, esto no se puede hacer programáticamente, funcionó para mí.

Simplemente fui a Inicio -> Desinstalar un programa y me desplacé hacia abajo hasta que encontré el VC ++ redistribuible, que incluye un número de versión. Buscando en Google el número de versión, me dijo que pertenece a VS2012 SP1.

bavaza
fuente
2

Pregunta antigua, pero aquí está el enfoque que hemos utilizado desde Visual Studio 2005 con éxito. También lo probé usando Visual Studio 2012 Update 4 (ya que finalmente estamos actualizando nuestro software de 2010 a 2012).

Dado que los paquetes redistribuibles de Visual C ++ registran su desinstalador con Windows (por lo que aparece en la lista "Programas y características" del Panel de control), simplemente buscamos el Nombre para mostrar de la clave del desinstalador en el registro.

Aquí está el código NSIS relevante:

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:

Tenga en cuenta que dado que nuestro instalador es un exe de 32 bits, Windows se encarga de determinar si la clave de registro está realmente en el Wow6432Node virtualizado en lugar de en la ubicación anterior, por lo que el código anterior funciona en instalaciones de Windows de 64 y 32 bits sin tener que verificar ambas claves explícitamente.

También tenga en cuenta que para actualizar el código anterior a una versión diferente de VC ++ Redist, simplemente cambie el GUID en la ruta de la clave de registro y el nombre para mostrar a lo que necesite.

Si bien este puede no ser el método recomendado, ha funcionado en más de 10,000 máquinas durante los últimos 10 años ejecutando todas las versiones de Windows desde XP / XP64 hasta Windows 10 usando listas rojas para 2005, 2010, 2010sp1 y ahora 2012u4.

kinar
fuente
1

Verificaría el Installedvalor de

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

  • donde GUID de VC++ 2012 (x86)es{33d1fd90-4274-48a1-9bc1-97e33d9c2d6f}
  • WOW6432Nodeestará presente o no dependiendo del VC++ redistproducto
Aprendiz
fuente
0

Lo que la mayoría de la gente pierde es lo necesario /reg:32para buscar la clave en Windows x64.

Consulte el artículo de la Ayuda de Microsoft sobre este tema.

Aquí hay un script que demuestra cómo comprobar correctamente Visual C ++ Redistributable para 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
fuente
0

La solución de script de powershell:

Basado en la información en la respuesta de @kayleeFrye_onDeck

He creado un script de PowerShell que verifica e instala las versiones que especifica el usuario, no he realizado pruebas exhaustivas con él, pero para mi propio escenario de CI (Integración continua) funciona perfectamente.

El guión completo e información sobre github

El enfoque que utilicé se basó en verificar las claves de registro según la información proporcionada aquí. Lo siguiente es la esencia de lo que hace el guión:

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

La verificación / descarga / instalación silenciosa basada en la $redistInfoque contiene la información compilada de 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
}

El script completo y más información se pueden encontrar en github.

Cualquiera es bienvenido a contribuir, si tengo tiempo haré pruebas más extensas del script y seguiré intentando agregar nuevos paquetes a medida que se agregue información aquí.

Jim Wolff
fuente
0

Es difícil obtener todos los valores de registro para VC 2012, así que he escrito una pequeña función que revisará todas las dependencias y coincidirá con la versión especificada.

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

Dependencias:

using System.Text.RegularExpressions;
using Microsoft.Win32;
using System.Linq;
ssamko
fuente
-5

se puede buscar en el registro. En realidad, no tengo vs2012 pero tengo vs2010.

Hay 3 claves de registro diferentes (pero muy similares) para cada uno de los 3 paquetes de plataforma. Cada clave tiene un valor DWORD llamado "Instalado" con un valor de 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

Puede usar la función de registro para eso ...

vikky
fuente
1
Lo he escrito en la primera línea "Que no tengo VS2012". Así que no es necesario comentar esto ............. Y esto fue solo para vs2010
vikky
1
Notó eso, pero parecía que estaba sugiriendo que su solución también puede funcionar para VS2012, ya que esa era la pregunta del OP (pero no pudo verificarlo ya que no tiene VS2012). Simplemente estaba diciendo que este enfoque, de hecho, no funciona con VS2012 desde que lo comprobé.
StellarEleven
¿Por qué votar en contra de mi respuesta? ... He escrito en claro que es para vs2012 ... y esto es aceptado como respuesta por el usuario ... ¿entonces por qué ???????????
vikky
1
Parece que con un sistema operativo x64 bit este valor se encuentra enHKLM\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\10.0\VC\VCRedist\...
bas
1
Las claves de VS 2012 son HKLM \ SOFTWARE \ Microsoft \ VisualStudio \ 11.0 \ VC \ RunTimes ____ HKLM \ SOFTWARE \ Wow6432Node \ Microsoft \ VisualStudio \ 11.0 \ VC \ RunTimes ___
Adam L