2016-05-23 9 views
15

У меня есть приложение C++, разработанное с использованием Visual Studio 2015, вместе с установщиком Wix и Burnstrapper Burn. Предыдущие версии приложения могли использовать модуль слияния Visual Studio для установки необходимых предварительных условий, но, похоже, это не вариант при использовании Visual Studio 2015 (см. Redistributables for deploying C++ exe developed with Visual Studio 2015 on Windows 7).Wix Burn vcredist

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

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

Мои вопросы:

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

ответ

21
  1. Развертывание VCRedist является подходящим подходом принять.

  2. Вы можете использовать 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, используя поиск кода обновления, как указано here.

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

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

    а) 14.0.23026 - Загружаемые из ссылки от Microsoft here.

    б) 14.0.23506 - с Visual Studio 2015 Обновление 1.

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

+0

Удивительный ответ! Чтобы уточнить, наше неофициальное тестирование до сих пор не сталкивалось с какими-либо проблемами, используя новую версию распространяемых материалов для исполняемого файла, скомпилированную против более старой версии (то есть мы не обновлялись до версии 1 или 2 для Visual Studio 2015). Гарантируется ли это, или нам нужно обновить Visual Studio, прежде чем мы начнем отправлять новые распространяемые ресурсы? – Runt8

+1

В моем тестировании я не обнаружил проблем с продуктом, созданным с использованием старой версии vcredist на компьютере с уже установленной версией vcredist. Однако нет никакой гарантии, что будущий выпуск vcredist не сломает что-то. Я имею тенденцию идти с последней версией vcredist, исходя из предположения, что последняя версия имеет самые последние ошибки и исправления безопасности и т. Д. – bradfordrg

+0

есть раздел реестра, который можно прочитать, чтобы определить, какая версия установлена ​​в данный момент, и использовать это как установить условие для exepackage? «InstallCondition» http://wixtoolset.org/documentation/manual/v3/xsd/wix/exepackage.html – tollgen

2

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

в wix burn bootstrapper использовать util:ProductSearch с параметром UpgradeCode. , а затем укажите минимум версии в DetectCondition.

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

+0

Текущие версии развертываются через пакеты пучков. У них есть другой идентификатор пакета. Это не может быть просмотрено с помощью 'util: ProductSearch' на данный момент –