Wix Burn vcredist

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

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

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

Мои вопросы:

  1. Развертывание vcredist - это «правильный» подход? (Предполагая, что нам нужен один установщик exe)
  2. Как мы можем узнать, какая версия распространяемых файлов установлена ​​(не обязательно в загрузчике, хранится ли эта информация где-нибудь в читаемой пользователем форме)?
  3. Есть ли более новые версии распространяемых файлов, которые мы должны распространять? (В настоящее время используется 14.0.23026) Основано ли это на версии Visual Studio, которая используется для компиляции, или мы всегда должны распространять последнюю версию? (Текущая версия VS 14.0.23107.0)
  4. В крайнем случае, можно ли обнаружить код ошибки, возвращаемый vcredist, и позволить этому значению определять, будет ли установка продолжена или завершится ошибкой?

person Runt8    schedule 23.05.2016    source источник


Ответы (2)


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

  2. Для поиска один из файлов 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 и позволяю самому самому решать, устанавливать, обновлять или ничего не делать.

  3. На сегодняшний день я нашел три версии файлов redist VC14:

    а) 14.0.23026 - можно загрузить по ссылке Microsoft здесь .

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

    c) 14.0.23918 - входит в состав Visual Studio 2015 Update 2.

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

  4. Вы можете указать прожигу игнорировать уже установленный код ошибки 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. В итоге я выбрал следующее решение: а) включить последнюю версию vcredist (14.0.23918) и б) добавить директиву <ExitCode Value="1638" Behavior="success"/>, чтобы программа burn не выдавала ошибку, если уже установлена ​​будущая более новая версия vcredist.

person bradfordrg    schedule 23.05.2016
comment
Отличный ответ! Чтобы уточнить - наше неформальное тестирование до сих пор не выявило каких-либо проблем с использованием новой версии распространяемых файлов против исполняемого файла, скомпилированного для более старой версии (т.е. мы не обновились до Visual Studio 2015 с обновлением 1 или 2). Гарантированно ли это так, или нам нужно обновить Visual Studio, прежде чем мы начнем поставлять новые распространяемые файлы? - person Runt8; 24.05.2016
comment
В ходе тестирования я не обнаружил никаких проблем с запуском продукта, созданного с использованием более старой версии vcredist, на компьютере с уже установленной более новой версией vcredist. Однако нет никакой гарантии, что будущий выпуск vcredist что-то не сломает. Я предпочитаю использовать последнюю версию vcredist, исходя из предположения, что последняя версия содержит самые свежие ошибки, исправления безопасности и т. Д. - person bradfordrg; 24.05.2016
comment
есть ли ключ реестра, который можно прочитать, чтобы определить, какая версия установлена ​​в настоящее время, и использовать его в качестве условия установки для exepackage? InstallCondition wixtoolset.org/documentation/manual/v3/xsd/wix/exepackage .html - person tollgen; 25.05.2016
comment
@tollgen - мне неизвестен ключ реестра, который можно было бы легко прочитать, чтобы обнаружить наличие exepackage. Я обновил свой ответ, указав конкретные подробности о том, как может работать FileSearch. - person bradfordrg; 26.05.2016
comment
‹Util: FileSearch Id = GetVC14X64Exists Condition = VersionNT64 Variable = vc14x64Exists Path = [SystemFolder] vcruntime140.dll Result = exists /› всегда возвращает false для меня (c: \ windows \ system32 \ vcruntime140.dll не найден), даже если пакет установлен. Установка по-прежнему выглядит нормально, возможно, потому, что при запуске установщика VSRedist он обнаруживает, что он уже установлен, я заметил это, когда отменил установку и проверил журналы. На данный момент я просто использую номер версии в условии обнаружения. Это отлично работает, и установка идет быстрее. - person Daniel; 12.08.2016
comment
Отлично узнать об атрибуте ExitCode, именно то, что мне нужно! Но на самом деле есть ключ реестра, в котором вы можете найти установленную версию VCRedist: Я использую ‹util: RegistrySearch Root = HKLM Key = SOFTWARE \ Wow6432Node \ Microsoft \ VisualStudio \ 14.0 \ VC \ Runtimes \ x64 Value = Major Variable = Current_VCRedist_2015_x64_MajorVersion / ›На моей установке x64 (и аналогично для дополнительных номеров и версий сборки. - person Torbjörn Bergstedt; 31.10.2016
comment
Спасибо за этот ответ, и у меня есть еще один вопрос: если мы должны использовать Burn для этого, означает ли это, что мы можем развертывать приложения только в файл .exe? Как мы можем записать vcredist в MSI, чтобы наши клиенты могли развернуть MSI в своей компьютерной сети? - person Bill Hoo; 28.04.2018
comment
@BillHoo Вам не обязательно использовать Burn. Продукт под названием AdvancedInstaller описывает, как упаковать MSI и vcredist в другой MSI (см. Последнюю запись advancedinstaller.com/forums/viewtopic.php?t=29284). Сам я этим продуктом не пользовался. - person bradfordrg; 04.05.2018
comment
@bradfordrg Спасибо, я использую WiX в наших конвейерах CD и не собираюсь менять инструментальные средства. Так что, похоже, у меня остался единственный способ использовать Burn и сделать установщик .exe правильно? Может быть, мне стоит погуглить о том, как развернуть файлы .exe с доменом Windows AD. - person Bill Hoo; 07.05.2018
comment
Чтобы распространяемый пакет сообщал о ходе выполнения загрузчику Burn, используйте пакет цепочек, например /quiet /norestart /install /ChainingPackage &quot;[WixBundleName]&quot;, и воспользуйтесь преимуществами Protocol="netfx4". - person RMart; 26.11.2019

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

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

для получения полной информации см. этот мой ответ: https://stackoverflow.com/a/35889484

person Opmet    schedule 07.12.2016
comment
Текущие версии развертываются с помощью пакетов записи. У них есть другой идентификатор пакета. Это не может быть найдено с помощью util:ProductSearch в данный момент - person Stephen Reindl; 10.02.2018