Установщик Wix на пользователя для обнаружения распространяемого пакета Visual C ++ 2015 - PullRequest
0 голосов
/ 05 декабря 2018

Я создаю установщик MSI, который должен определить, присутствует ли распространяемый Visual C ++ 2015 в системе, а если нет, прервать установку с помощью специального сообщения.Официальная документация по Wix относится к фактической установке VC ++, которую я не хочу делать, так как мой установщик «для каждого пользователя». Есть несколько других вопросов stackoverflow, которые относятся к пакету, а не к .msi http://wixtoolset.org/documentation/manual/v3/howtos/redistributables_and_install_checks/install_vcredist.html.
Wix Burn vcredist , WIX проверяет, установлен ли распространяемый VS2015 C ++ , https://gist.github.com/nathancorvussolis/6852ba282647aeb0c5c00e742e28eb48

Так что я думаю, вопрос в том, как эффективно обнаружитьналичие Visual C ++ 2015 распространяемого в установщике для каждого пользователя.

1 Ответ

0 голосов
/ 05 декабря 2018

Подходы обнаружения во время выполнения

Я могу найти несколько способов обнаружить присутствие Visual C ++ Runtime .

  1. Реестр

  2. Проверка наличия и версии файла

    • Проверка наличия основных файлов времени выполнения
    • См. Отдельный раздел ниже
  3. MSI API

    • Вы можете определить, является ли конкретный MSIустанавливается путем поиска GUID продукта
    • Надежно, но трудно отследить все GUID продукта (разные версии)
    • UPDATE : Вы также можете использовать код обновлениякак описано ниже.Он должен оставаться стабильным при всех выпусках и обновлениях (для каждой основной версии и, возможно, также между основными версиями).
  4. Fall-Over EXE?

    • Предполагается использовать EXE в зависимости от времени выполнения
    • Запуск и сбой означает, что время выполнения отсутствует или не работает

Хорошие и плохие - Оценка : Option 1 представляется уязвимой, поскольку вариант модуля слияния развертывания среды выполненияможет не написать эти ключи.Option 3 может хорошо работать, но сложно отследить все GUID.Option 4, по-видимому, уже потерпел неудачу из-за более новых сред выполнения, удаляющих определенные ключи реестра.Хотя сейчас это исправлено, это может всплыть на поверхность.


Наличие версии файла / проверка версии

Чем больше я смотрю на это, тем больше я начинаю думать, что вы должны проверить фактическуюсами файлы, и, возможно, для правильной версии файла.Файл vcruntime140.dll в папке System32 (64-разрядная версия) и SysWOW64 папка (32-разрядная версия)? Смотрите список файлов внизу .

Просто добавьте ссылку для хранения.

Тестовый VBScript - только для целей тестирования:

Set fso = CreateObject("Scripting.FileSystemObject")
MsgBox fso.GetFileVersion("C:\Windows\System32\vcruntime140.dll")

Youможет определить наличие и версию файла, используя AppSearch в MSI-файле.


Ниже приведены некоторые другие вещи, которые я написал, просто оставив их.


VCRedist

Кажется, распространяемые пакеты Visual C ++ (VCRedist_x86.exe, VCRedist_x64.exe) - рекомендуемый способ развертываниявремя выполнения - проверяет следующий раздел реестра, чтобы определить, какие версии среды выполнения фактически установлены:

HKLM\SOFTWARE\Microsoft\VisualStudio\<version>\VC\Runtimes\

Подключи x86 и x64Кажется, что содержит значение " Установлено ", которое устанавливается на 1 при установке среды выполнения.Я бы предположил - не успев все это проверить - что тогда вы сможете проверить:

  • HKLM\SOFTWARE\WOW6432Node\Microsoft\VisualStudio\14.0\VC\Runtimes\x64 Installed = 1
  • HKLM\SOFTWARE\WOW6432Node\Microsoft\VisualStudio\14.0\VC\Runtimes\x86 Installed = 1

Модуль слияния : после краткой проверки эти значения не записываются модулями слияния, которыетакже может быть использован для распространения этой среды выполнения.Сейчас у меня нет времени или средств, чтобы проверить это должным образом.

Удивительно, но и версия 2015, и версия 2017 среды выполнения записывают данные в ключ 14.0, поскольку они двоично совместимы. Если установлена ​​версия 2017 года, то исполняемый файл VCRedist выдаст ошибку, поскольку установка не требуется.Странно действительно.Но для вашей цели это должно быть не в этом. Источник .


MSI API - получение кодов продуктов

Макет :

Public installer
Set installer = CreateObject("WindowsInstaller.Installer")

' Don't have the 2015 GUID
VC2015 = CheckForProductCode("{00000000-0000-0000-0000-000000000000}")
VC2017 = CheckForProductCode("{C77195A4-CEB8-38EE-BDD6-C46CB459EF6E}")

MsgBox "VC2015: " & CStr(VC2015) & vbCrLf & "VC2017: " &  CStr(VC2017)

Function CheckForProductCode(productcode)

   CheckForProductCode = False

    For Each product In installer.ProductsEx("", "", 7)   
        If(LCase(productcode) = LCase(product.ProductCode)) Then
            CheckForProductCode = True
            Exit For
        End If
    Next

End Function

Обновление на основе предложения Zett42 для перечисления совместного использования продуктовтот же код обновления:

Set installer = CreateObject("WindowsInstaller.Installer")

' Enumerate all products related to "Microsoft Visual C++ 2008 Redistributable - x86 9.0.30729.4148"

' {AA783A14-A7A3-3D33-95F0-9A351D530011} is the upgrade code
Set upgrades = installer.RelatedProducts("{AA783A14-A7A3-3D33-95F0-9A351D530011}")
For Each u In upgrades
   MsgBox u, vbOKOnly, "Product Code: "
Next

Развертывание среды выполнения Visual Studio C ++

Помимо обнаружения, существует несколько подходов для распространения среды выполнения Visual Studio C ++:

  1. Статическое связывание
  2. Распространяемые пакеты Visual C ++
    • VCRedist_x86.exe, VCRedist_x64.exe или VCRedist_arm.exe
    • Program Files(x86)\Microsoft Visual Studio\2017\edition\VC\Redist\MSVC\lib-version
  3. Распространяемые модули слияния (.msm files)
  4. Локальная папка приложения
    • Копирование DLL в локальную папку приложения
    • Не рекомендуется по причинам обслуживания (обновления, исправления безопасности)

Ссылки для безопасного хранения :


Старый ответ

Это старое сообщение.Я не слишком люблю прямые чтения реестра, позвольте мне посмотреть, смогу ли я найти более надежный способ, но, может быть, посмотрим, в какое время: Определите, установлен ли распространяемый Visual C ++ для Visual Studio 2012

Еще одна ссылка, как найти код продукта установщика Windows для установленных продуктов: Как найти GUID продукта установленной установки MSI?

...