¿Cómo detectar si Visual C ++ Redistributable para Visual Studio 2012 está instalado?
Probé Google y nadie ha hecho esta pregunta, ¡sorpresa!
¿Cómo detectar si Visual C ++ Redistributable para Visual Studio 2012 está instalado?
Probé Google y nadie ha hecho esta pregunta, ¡sorpresa!
Respuestas:
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:
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
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
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
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.1
para los binarios ATL y MFC, y 11.0.51106.1
para todo lo demás, por ejemplo, msvcp110.dll y 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
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
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
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
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.27702
y 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.6161
actualizació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.
[HKEY_CLASSES_ROOT\Installer\Dependencies\,,x86,14.0,bundle\Dependents\{$GUID}
y[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]
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).
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\DevDiv\VC\Servicing\11.0\RuntimeMinimum
Puede verificar que el Installed
valor esté 1
en esta ubicación de registro: HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\11.0\VC\Runtimes\x86
en 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
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\11.0\VC
pero no tengo la Runtimes
llave. Tengo la clave en la respuesta de Dave HKLM\SOFTWARE\Microsoft\DevDiv\VC\Servicing\11.0
.
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%'"
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.
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).
11.0.61030.0
) de VC ++ 2012 tienen la versión 11.0.60610.1
para los binarios ATL y MFC, y 11.0.51106.1
para 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_x86
y C:\ProgramData\Package Cache\{B175520C-86A2-35A7-8619-86DC379688B9}v11.0.61030\packages\vcRuntimeAdditional_x86
luego inspeccionando los archivos en los archivos .cab.
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
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).
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í.
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
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_VERSION
si #include <crtversion.h>
- de esta manera se puede determinar Calcular la versión CRT que su binario fue construido con.
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
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.
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.
Lo que la mayoría de la gente pierde es lo necesario /reg:32
para 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
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 $redistInfo
que 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í.
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;
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 ...
HKLM\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\10.0\VC\VCRedist\...