Установщик Wix не перезаписывает предыдущую версию исполняемого файла

У меня очень простой установщик - скопируйте одну DLL в подпапку Program Files и зарегистрируйте ее с помощью regsvr32.exe. Работает отлично, но если установлена ​​более старая версия dll, "Repair" не перезаписывает существующую dll. DLL подписана, и ее номер версии (сборки) всегда увеличивается (например, 2.0.0.123 - > 2.0.0.124).

Просматривая предыдущие подобные посты, я добавил RemoveExistingProducts и указал ProductId как "*". Удаление и установка более новой версии работает нормально, но мне действительно нужно восстановить, чтобы обновить существующую DLL.

Есть ли что-нибудь еще, что мне нужно сделать?

Спасибо!

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">

  <!--
When creating a new install for the next version, these fields must be modified
-->
  <?define ProductVersion = "2.0.00" ?>

  <?define ProductId64 = "*" ?>
  <?define ProductId32 = "*" ?>

  <?define PackageId   = "45F34788-66AC-441C-B666-707FFA7F1EE9" ?>


  <!-- Product name as you want it to appear in Add/Remove Programs-->
  <?if $(var.Platform) = x64 ?>
  <?define ProductName = "XYZ (64 bit)" ?>
  <?define Win64 = "yes" ?>
  <?define PlatformProgramFilesFolder = "ProgramFiles64Folder" ?>
  <?define ProductId = "$(var.ProductId64)" ?>
  <?define MainDllName = "XYZ64.dll" ?>
  <?define MainDllSource = "..\..\bin\Win64\Release\XYZ64.dll" ?>
  <?else ?>
  <?define ProductName = "XYZ (32 bit)" ?>
  <?define Win64 = "no" ?>
  <?define PlatformProgramFilesFolder = "ProgramFilesFolder" ?>
  <?define ProductId = "$(var.ProductId32)" ?>
  <?define MainDllName = "XYZ.dll" ?>
  <?define MainDllSource = "..\..\bin\Win32\Release\XYZ.dll" ?>
  <?endif ?>


  <?define UpgradeCode = "{C3763742-7C1C-4AB7-A404-F030B7550E97}" ?>


  <Product Id="$(var.ProductId)" Name="$(var.ProductName)" Language="1033" Version="$(var.ProductVersion)" Manufacturer="Advanced Messaging Systems LLC" UpgradeCode="$(var.UpgradeCode)">

    <Package Id="$(var.PackageId)" InstallerVersion="200" Compressed="yes" Description="XYZ Installer package"  InstallPrivileges="elevated"/>

    <!-- No restore point  -->
    <Property Id="MSIFASTINSTALL" Value="3" />

   <Media Id="1" Cabinet="media1.cab" EmbedCab="yes" />

    <Directory Id="TARGETDIR" Name="SourceDir">
      <Directory Id="$(var.PlatformProgramFilesFolder)">
        <Directory Id="INSTALLLOCATION" Name="XYZ">

          <Component Id="XYZDll" Guid="E2CBEE41-6C0E-4A84-95C1-7282747B4A3D">
            <File Id='MainDll' Name="$(var.MainDllName)" DiskId='1' Source="$(var.MainDllSource)" SelfRegCost="0" />

            <!-- TODO: Insert files, registry keys, and other resources here. -->
          </Component>

        </Directory>
      </Directory>
    </Directory>

    <Property Id="WIXUI_INSTALLDIR" Value="INSTALLLOCATION" />

    <!-- Note: Custom actions to install/uninstall the dll using regsvr32.exe -->
    <CustomAction Id="RegisterDll"
                      Directory="INSTALLLOCATION"
                      ExeCommand='regsvr32.exe /s "[INSTALLLOCATION]$(var.MainDllName)"'

                      Return="check">
    </CustomAction>
    <CustomAction Id="UnregisterDll"
                  Directory="INSTALLLOCATION"
                  ExeCommand='regsvr32.exe /s /u "[INSTALLLOCATION]$(var.MainDllName)"'>
    </CustomAction>


    <Feature Id="ProductFeature" Title="XYZ" Level="1">
      <ComponentRef Id="XYZDll" />
      <!-- Note: The following ComponentGroupRef is required to pull in generated authoring from project references. -->
      <ComponentGroupRef Id="Product.Generated" />
    </Feature>

    <InstallUISequence>
      <Custom Action="WixCloseApplications" Before="AppSearch"/>
    </InstallUISequence>

    <InstallExecuteSequence>

      <!-- Uninstall previous version before installing this one. -->
      <RemoveExistingProducts Before="InstallInitialize"/>


      <SelfRegModules/>
    </InstallExecuteSequence>

    <Icon Id="XYZ.ico" SourceFile="..\Graphics\XYZ.ico"/>
    <Property Id="ARPPRODUCTICON" Value="XYZ.ico" />

    <!-- UI -->
    <UIRef Id="WixUI_InstallDir"/>
    <UIRef Id="WixUI_ErrorProgressText" />

    <WixVariable Id="WixUILicenseRtf" Value="..\EULA\license.rtf" />
    <WixVariable Id="WixUIBannerBmp"  Value="..\Graphics\banner.jpg" />
    <WixVariable Id="WixUIDialogBmp"  Value="..\Graphics\logo.jpg" />


    <!-- End UI -->
  </Product>
</Wix>

ОБНОВЛЕНИЕ. Следующее сработало для меня после изменения записей обновления:

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">

  <!--
When creating a new install for the next version, these fields must be modified
-->
  <?define ProductVersion = "2.0.4" ?>

  <?define ProductId64 = "*" ?>
  <?define ProductId32 = "*" ?>

  <?define PackageId   = "*" ?>


  <!-- Product name as you want it to appear in Add/Remove Programs-->
  <?if $(var.Platform) = x64 ?>
  <?define ProductName = "XYZ (64 bit)" ?>
  <?define Win64 = "yes" ?>
  <?define PlatformProgramFilesFolder = "ProgramFiles64Folder" ?>
  <?define ProductId = "$(var.ProductId64)" ?>
  <?define MainDllName = "XYZ64.dll" ?>
  <?define MainDllSource = "..\..\bin\Win64\Release\XYZ64.dll" ?>
  <?else ?>
  <?define ProductName = "XYZ (32 bit)" ?>
  <?define Win64 = "no" ?>
  <?define PlatformProgramFilesFolder = "ProgramFilesFolder" ?>
  <?define ProductId = "$(var.ProductId32)" ?>
  <?define MainDllName = "XYZ.dll" ?>
  <?define MainDllSource = "..\..\bin\Win32\Release\XYZ.dll" ?>
  <?endif ?>


  <?define UpgradeCode = "{C3763742-7C1C-4AB7-A404-F030B7550E97}" ?>


  <Product
    Id="$(var.ProductId)"
    Name="$(var.ProductName)"
    Language="1033"
    Version="$(var.ProductVersion)"
    Manufacturer="Advanced Messaging Systems LLC"
    UpgradeCode="$(var.UpgradeCode)"
    >

    <Package Id="$(var.PackageId)"
             InstallerVersion="200"
             Compressed="yes"
             Description="XYZ Installer package"
             InstallPrivileges="elevated"
     />

    <!-- No restore point  -->
    <Property Id="MSIFASTINSTALL" Value="3" />


    <Upgrade Id="$(var.UpgradeCode)">
      <UpgradeVersion Minimum="1.0.0"
                      IncludeMinimum="yes"
                      OnlyDetect="no"
                      Maximum="$(var.ProductVersion)"
                      IncludeMaximum="no"
                      Property="PREVIOUSFOUND" />
    </Upgrade>


    <Media Id="1" Cabinet="media1.cab" EmbedCab="yes" />

    <Directory Id="TARGETDIR" Name="SourceDir">
      <Directory Id="$(var.PlatformProgramFilesFolder)">
        <Directory Id="INSTALLLOCATION" Name="XYZ">

          <Component Id="XYZDll" Guid="E2CBEE41-6C0E-4A84-95C1-7282747B4A3D">
            <File Id='MainDll' Name="$(var.MainDllName)" DiskId='1' Source="$(var.MainDllSource)" SelfRegCost="0" />

            <!-- TODO: Insert files, registry keys, and other resources here. -->
          </Component>

        </Directory>
      </Directory>
    </Directory>

    <Property Id="WIXUI_INSTALLDIR" Value="INSTALLLOCATION" />

    <!-- Note: Custom actions to install/uninstall the dll using regsvr32.exe -->
    <CustomAction Id="RegisterDll"
                      Directory="INSTALLLOCATION"
                      ExeCommand='regsvr32.exe /s "[INSTALLLOCATION]$(var.MainDllName)"'

                      Return="check">
    </CustomAction>
    <CustomAction Id="UnregisterDll"
                  Directory="INSTALLLOCATION"
                  ExeCommand='regsvr32.exe /s /u "[INSTALLLOCATION]$(var.MainDllName)"'>
    </CustomAction>


    <Feature Id="ProductFeature" Title="XYZ" Level="1">
      <ComponentRef Id="XYZDll" />
      <!-- Note: The following ComponentGroupRef is required to pull in generated authoring from project references. -->
      <ComponentGroupRef Id="Product.Generated" />
    </Feature>

    <InstallUISequence>
      <Custom Action="WixCloseApplications" Before="AppSearch"/>
    </InstallUISequence>

    <InstallExecuteSequence>

     <RemoveExistingProducts After="InstallInitialize"/>

      <SelfRegModules/>

    </InstallExecuteSequence>

    <Icon Id="XYZ.ico" SourceFile="..\Graphics\XYZ.ico"/>
    <Property Id="ARPPRODUCTICON" Value="XYZ.ico" />

    <!-- UI -->
    <UIRef Id="WixUI_InstallDir"/>
    <UIRef Id="WixUI_ErrorProgressText" />

    <WixVariable Id="WixUILicenseRtf" Value="..\EULA\license.rtf" />
    <WixVariable Id="WixUIBannerBmp"  Value="..\Graphics\banner.jpg" />
    <WixVariable Id="WixUIDialogBmp"  Value="..\Graphics\logo.jpg" />


    <!-- End UI -->
  </Product>
</Wix>

3 ответа

Решение

Если вы хотите серьезное обновление, начните с элемента WiX MajorUpgrade. Общие правила для обновления:

  1. Отличный ProductCode и PackageCode от более старого продукта.
  2. Инкремент ProductVersion где-то в первых трех полях.
  3. Тот же код обновления, что и у более старого продукта.
  4. Сделайте что-нибудь (например, Wix MajorUprade или Upgrade elements), чтобы убедиться, что у вас есть обновление.
  5. Установка на пользователя не будет обновлять установку на систему или наоборот.

В исходном случае несоблюдение правил 1 и 2 означало, что Windows считала, что тот же продукт уже установлен, и перешла в режим восстановления. Это должно было быть вашим первым предупреждением, потому что серьезное обновление выглядит как новая установка, а не как ремонт. Если у вас есть две записи в разделе "Программы и компоненты", это означает, что одно или несколько из этих 4 требований не были выполнены. Если вы получаете "Другая версия этого продукта уже установлена", это означает, что вы не следовали правилу 1, и различия в поведении связаны со значениями ProductCode и PackageCode по сравнению с установленным продуктом.

Я удивлен, что эта строка на самом деле разрешена компилятором и компоновщиком Wix:

 <?define PackageId   = "45F34788-66AC-441C-B666-707FFA7F1EE9" ?>

Если это действительно работает и проходит, что я не проверял, это означает, что ваш пакет имеет жестко закодированный идентификатор пакета. Я думал, что Wix показал защиту от этой проблемы? Возможно, это так? Мы должны проконсультироваться с сообществом Wix, имеет ли смысл когда-либо разрешать жестко запрограммированное сопровождение пакета. Я полагаю, что это может быть необходимо для целей отладки и тестирования, но по крайней мере должно быть предупреждение компилятора.

Идея GUID пакета состоит в том, что он должен быть уникальным для каждого скомпилированного файла MSI. Это просто, чтобы однозначно идентифицировать файл. Установщик Windows рассматривает два разных файла MSI с одинаковым guid пакета как один и тот же файл по определению. Все виды X-файлов проблемы в результате. Соответственно , GUID пакета всегда должен генерироваться автоматически, поскольку он просто должен быть уникальным. Пожалуйста, попробуйте сначала решить эту проблему, чтобы проверить, решает ли это вашу общую проблему. Установите это равным *.

Мой совет - автоматически генерировать идентификатор пакета и идентификатор продукта, но устанавливать жестко закодированный код обновления. Код обновления идентифицирует " семейство продуктов " и полезен для идентификации любого экземпляра вашего продукта независимо от языка и версии. Может быть полезно использовать отдельный код обновления для 64-разрядных и 32-разрядных установок, поскольку обе версии могут быть установлены одновременно на некоторых системах.

Вы также можете отказаться от использования regsvr32.exe для самостоятельной регистрации и извлечь COM-данные из вашей dll для надлежащей поддержки MSI: MSI register dll - Самостоятельная регистрация считается вредной. И, возможно, также проверьте это: Зарегистрируйте ActiveX exe-сервер с помощью WiX (проверьте RegSpy2, если Heat не работает).

Также обратите внимание, что вы можете исключить множество исходных атрибутов из вашего XML-файла Wix и полагаться на значения по умолчанию Wix вместо жестких значений кодирования.

Некоторые дополнительные сведения о GUID и замене файлов:

Короткий ответ (другой стал слишком запутанным): попробуйте удалить эту строку и автоматически сгенерируйте идентификатор пакета, установив для него значение "*":

 <?define PackageId   = "45F34788-66AC-441C-B666-707FFA7F1EE9" ?>

Обратите внимание, что вы должны прекратить использование всех предыдущих сборок MSI после удаления их всех. Это связано с неисправной жестко закодированной направляющей пакета, которая может вызвать непредсказуемые и непредвиденные проблемы.

Другие вопросы по тегам