Wix Burn vcredist

У меня есть приложение С++, разработанное с использованием Visual Studio 2015, вместе с установщиком Wix и Burnstrapper Burn. Предыдущие версии приложения могли использовать модуль слияния Visual Studio для установки необходимых предварительных условий, но, похоже, это не вариант при использовании Visual Studio 2015 (см. Распространяемые материалы для развертывания С++ exe, разработанный с помощью Visual Studio 2015 в Windows 7).

Следуя советам по этой ссылке, мы начали установку vcredist с Burn с помощью ExePackage с virtual = "yes". Это в основном работает отлично - у нас было несколько клиентов, у которых нет сбоев в установке из-за различных проблем с vcredist. До недавнего времени это были ошибки, которые должны были привести к сбою установки.

В течение последних нескольких дней мы получили несколько отчетов об отказе нашего установщика из-за того, что была установлена ​​более новая версия распространяемого: vcredist с кодом ошибки 0x80070666, что приводит к сбою нашего загрузчика.

Мои вопросы:

  • Развертывает ли vcredist "правильный" подход? (Предполагая, что нам нужен один установщик exe)
  • Как мы можем определить, какая версия распространяемых компонентов (не обязательно в загрузочном файле, это информация, хранящаяся в удобной для пользователя форме)?
  • Существует ли более новая версия распространяемых материалов, которые мы должны распространять? (В настоящее время используется 14.0.23026). Это основано на версии Visual Studio, которая используется для компиляции или всегда должна распространять последнюю версию? (Текущая версия VS 14.0.23107.0)
  • В качестве последнего средства можно определить код ошибки, возвращаемый из vcredist, и разрешить это значение для определения того, продолжается ли установка или не выполняется?

Ответ 1

  • Развертывание vcredist - это подходящий подход.

  • Вы можете использовать FileSearch Element (Util Extension) для поиска одного из файлов vcredist и получения его версии. Однако этот подход усложняется тем фактом, что ожог, построенный в переменных SystemFolder и System64Folder, отменяется по сравнению с аналогичными переменными в установщике Windows. Пример поиска 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"/>
    

    Затем переменные vc14x64Exists и vc14x64Version могут использоваться в DetectCondition для определения того, установлена ​​ли 64-разрядная версия VC14:

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

    Аналогично DetectCondition для 32-разрядной версии VC14:

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

    Примечание: В обоих случаях вам нужно подставить nnnnn номер сборки vcredist, который вы включаете в свой установщик.

    Изменить 1:. В качестве альтернативы вы можете обнаружить присутствие VC Redist, используя поиск кода обновления, как описано здесь.

    Изменить 2: В установщиках, которые я автор, я вообще не пытаюсь обнаружить наличие VC Redist. Вместо этого я запускаю установщик VC Redist и позволяю себе выяснить, устанавливать ли, обновлять или ничего не делать.

  • На сегодняшний день я нашел три версии редиректных файлов VC14:

    a) 14.0.23026 - Загружается из ссылки Microsoft здесь.

    b) 14.0.23506 - поставляется с обновлением Visual Studio 2015 1.

    c) 14.0.23918 - с обновлением версии Visual Studio 2015 2.

    Хотя новые версии vcredist были выпущены с обновлениями Visual Studio, Microsoft не обновила версию, загружаемую со своего веб-сайта.

  • Вы можете сообщить ожогу, чтобы игнорировать уже установленный код ошибки 0x80070666 с помощью <ExitCode Value="1638" Behavior="success"/>. Заметим, что 1638 = 0x666. Например:

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

Недавно я столкнулся с аналогичной проблемой, когда установщик продукта, над которым я работал, остановился с ошибкой 0x80070666. Проблема заключалась в том, что уже установлена ​​новая версия vcredist. Решением, которое я использовал, было: a) включить последнюю версию vcredist (14.0.23918) и b) добавить директиву <ExitCode Value="1638" Behavior="success"/>, чтобы сообщить об ошибке, чтобы не выкидывать ошибку, если уже установлена ​​более новая версия vcredist.

Ответ 2

чтобы обнаружить наличие пакета vcredist, который вам нужно найти по его UpgradeCode.
это позволит убедиться, что также найдены более поздние версии.

в загрузочном загрузчике wix используйте util:ProductSearch с параметром UpgradeCode. а затем укажите минимальную версию в DetectCondition.

Подробнее см. в этом ответе: fooobar.com/info/386021/...