wixproj visual toolset tools studio source open instalador for extension visual-studio-2015 wix burn vcredist

visual studio 2015 - visual - Wix Burn vcredist



wix toolset visual studio 2019 extension (2)

Tengo una aplicación c ++ desarrollada utilizando Visual Studio 2015, junto con un instalador Wix y un bootstrapper de Burn. Las versiones anteriores de la aplicación pudieron usar el módulo de combinación de Visual Studio para instalar los requisitos previos necesarios, pero parece que esta no es una opción cuando se usa Visual Studio 2015 (vea Redistribuibles para implementar C ++ exe desarrollado con Visual Studio 2015 en Windows 7 ).

Siguiendo los consejos en ese enlace, hemos comenzado a instalar vcredist con Burn usando un ExePackage con vital = "yes". En general, esto funciona muy bien: hemos tenido varios clientes que fallaron en la instalación debido a varios problemas con vcredist. Hasta hace poco, estos eran errores que debían hacer que la instalación fallara.

En los últimos días, hemos recibido varios informes de fallas de nuestro instalador debido a la instalación de una versión más nueva del redistribuible: vcredist falla con el código de error 0x80070666, lo que hace que nuestro bootstrapper falle.

Mis preguntas son:

  1. ¿Es el despliegue de vcredist el enfoque "correcto" a tomar? (Suponiendo que necesitamos tener un solo instalador exe)
  2. ¿Cómo podemos saber qué versión de los redistribuibles están instalados (no necesariamente en el bootstrapper, esta información se almacena en un formato legible por el usuario en algún lugar)?
  3. ¿Hay una versión más nueva de los redistribuibles que deberíamos distribuir? (Actualmente utilizando 14.0.23026) ¿Se basa esto en la versión de Visual Studio que se está utilizando para compilar o siempre debemos distribuir la última versión? (Versión actual VS 14.0.23107.0)
  4. Como último recurso, ¿es posible detectar el código de error devuelto por vcredist y permitir que ese valor determine si la instalación continúa o falla?

  1. La implementación de vcredist es un enfoque apropiado a tomar.

  2. Puede usar el elemento FileSearch (Util Extension) para buscar uno de los archivos vcredist y recuperar su versión. Sin embargo, este enfoque se complica por el hecho de que la grabación integrada en las variables SystemFolder y System64Folder se invierte con respecto a las variables similares en Windows Installer. Ejemplo de búsquedas para VC14:

    <!-- Detect existing version of VC ++ 2015 x64 libraries --> <util:FileSearch Id="GetVC14X64Exists" Condition="VersionNT64" Variable="vc14x64Exists" Path="[SystemFolder]vcruntime140.dll" Result="exists"/> <util:FileSearch Id="GetVC14X64Version" Condition="VersionNT64" Variable="vc14x64Version" Path="[SystemFolder]vcruntime140.dll" Result="version"/> <!-- Detect existing version of VC ++ 2015 x86 libraries --> <util:FileSearch Id="GetVC14X86onX64Exists" Condition="VersionNT64" Variable="vc14x86Exists" Path="[System64Folder]vcruntime140.dll" Result="exists"/> <util:FileSearch Id="GetVC14X86onX64Version" Condition="VersionNT64" Variable="vc14x86Version" Path="[System64Folder]vcruntime140.dll" Result="version"/> <util:FileSearch Id="GetVC14X86onX86Exists" Condition="NOT VersionNT64" Variable="vc14x86Exists" Path="[SystemFolder]vcruntime140.dll" Result="exists"/> <util:FileSearch Id="GetVC14X86onX86Version" Condition="NOT VersionNT64" Variable="vc14x86Version" Path="[SystemFolder]vcruntime140.dll" Result="version"/>

    Las variables vc14x64Exists y vc14x64Version se pueden usar en DetectCondition para determinar si la versión de 64 bits de VC14 está instalada:

    DetectCondition="vc14x64Exists AND vc14x64Version &gt;= v14.0.nnnnn"

    De manera similar, el DetectCondition para la versión de 32 bits de VC14 es:

    DetectCondition="vc14x86Exists AND vc14x86Version &gt;= v14.0.nnnnn"

    Nota: En ambos casos, debe sustituir nnnnn con el número de compilación del vcredist que está incluyendo en su instalador.

    Edición 1: Como alternativa, podría detectar la presencia de VC Redist utilizando una búsqueda de código de actualización como se describe here .

    Edición 2: en los instaladores que autorizo, generalmente no trato de detectar la presencia de VC Redist. En lugar de eso, dejo que el instalador de VC Redist se ejecute y me permito averiguar si instalar, actualizar o no hacer nada.

  3. Hasta la fecha he encontrado tres versiones de los archivos redist de VC14:

    a) 14.0.23026 - Descargable desde el enlace de Microsoft here .

    b) 14.0.23506 - Proporcionado con Visual Studio 2015 Update 1 .

    c) 14.0.23918 - provisto con la actualización 2 de Visual Studio 2015 .

    Aunque se han lanzado nuevas versiones de vcredist con actualizaciones de Visual Studio, Microsoft no ha actualizado la versión descargable desde su sitio web.

  4. Puede indicar a burn que ignore el código de error ya instalado 0x80070666 usando <ExitCode Value="1638" Behavior="success"/> . Tenga en cuenta que 1638 = 0x666. Por ejemplo:

    <!-- Microsoft Visual C++ 2015 x86 libraries --> <PackageGroup Id="VC14RedistX86"> <ExePackage Cache="no" Compressed="yes" PerMachine="yes" Permanent="yes" Vital="yes" Name="Redist/vcredist14_x86.exe" SourceFile="$(var.RedistPath)/VC14/vcredist_23918_x86.exe" InstallCommand="/install /quiet /norestart"> <!-- --> <ExitCode Value="3010" Behavior="forceReboot"/> <!-- Ignore "Newer version installed" error --> <ExitCode Value="1638" Behavior="success"/> </ExePackage> </PackageGroup>

Me encontré con un problema similar recientemente cuando un instalador del producto en el que estaba trabajando se detuvo con el error 0x80070666. El problema era una versión más nueva de vcredist ya instalada. La solución que terminé usando fue: a) incluir la última versión de vcredist (14.0.23918), yb) agregar la <ExitCode Value="1638" Behavior="success"/> para indicar a Burn que no lance un error si ya está instalada una nueva versión futura de vcredist.


para detectar la presencia de un paquete vcredist debe buscar por su UpgradeCode .
Esto asegurará que también se encuentren versiones posteriores.

en un wix burn bootstrapper use util:ProductSearch con el parámetro UpgradeCode . y luego especifique una versión mínima en DetectCondition .

para más detalles vea esta respuesta mía: https://.com/a/35889484