Wix uninstall не удаляет файлы

У меня есть проект C# с установщиком WiX.

Когда я устанавливаю свое приложение, все работает. Я имею:

  • моя compagny папка в программных файлах (x86), содержащая папку моего приложения и папку драйверов.
  • ярлык в рабочем столе
  • ярлык в меню "Пуск"

Когда приложение установлено, я могу запустить MSI, и у меня есть возможность удалить. Но когда я удаляю свое приложение, удаляется только папка драйверов (MyApplication_Drivers). У меня все еще есть папка с приложениями и ярлыки.

Что мне не хватает?

Вот мой код для product.wxs (весь код, потому что я не знаю, откуда возникла проблема):

<?xml version="1.0" encoding="UTF-8"?>
<?define compagny = "My compagny"?>
<?define product = "MyApplication"?>
<?define version = "!(bind.FileVersion.MyApplication.exe)"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
    <Product Id="*"
           Name="$(var.product)"
           Language="1033"
           Version="$(var.version)"
           Manufacturer="$(var.compagny)"
           UpgradeCode="***">
        <Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine" />
        <MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." />
    <Media Id="1" Cabinet="MyApplication.cab" EmbedCab="yes"/>

    <Feature Id="ProductFeature" Title="$(var.product)" Level="1">
      <ComponentGroupRef Id="ProductComponents"/>
      <ComponentRef Id ="InstallFonts" />
      <ComponentRef Id ="ApplicationShortcut"/>
      <ComponentRef Id ="ApplicationShortcutDesk"/>
    </Feature>

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

    <WixVariable Id="WixUIBannerBmp"
                 Value=".\Images\WixUIBannerBmp.bmp"/>
    <WixVariable Id="WixUIDialogBmp"
                 Value=".\Images\WixUIDialogBmp.bmp"/>

    <UI>
      <UIRef Id="WixUI_Custom"/>      

      <Publish Dialog="WelcomeDlg"
               Control="Next"
               Event="NewDialog"
               Value="InstallDirDlg"
               Order="2">1</Publish>

      <Publish Dialog="InstallDirDlg"
               Control="Back"
               Event="NewDialog"
               Value="WelcomeDlg"
               Order="2">1</Publish>
    </UI>
    </Product>

  <Fragment>
    <Directory Id="TARGETDIR" Name="SourceDir">
      <Directory Id="FontsFolder" />

      <Directory Id="ProgramMenuFolder">
        <Directory Id="ApplicationProgramsFolder" Name="$(var.compagny)"/>
      </Directory>

      <Directory Id="DesktopFolder" SourceName="Desktop"/>

      <Directory Id="ProgramFilesFolder">
        <Directory Id="COMPAGNYFOLDER" Name="$(var.compagny)">
          <Directory Id="INSTALLFOLDER" Name="$(var.product)">
            <Directory Id="fr" Name="fr"/>
            <Directory Id="SETTINGS" Name="Settings">
              <Directory Id="PRINTERS" Name="Printers"/>
            </Directory>
          </Directory>
          <Directory Id="Drivers" Name="MyApplication_Drivers"/>
        </Directory>
      </Directory>
    </Directory>
  </Fragment>

  <Fragment>
    <DirectoryRef Id="ApplicationProgramsFolder">
      <Component Id="ApplicationShortcut" Guid="***">
        <Shortcut Id="ApplicationStartMenuShortcut"
                  Name="$(var.product)"
                  Description="$(var.product) application"
                  Target="[#MyApplication.exe]"
                  WorkingDirectory="INSTALLFOLDER"/>
        <RemoveFolder Id="ApplicationProgramsFolder" On="uninstall"/>
        <RegistryValue Root="HKCU" Key="SOFTWARE\$(var.compagny)\$(var.product)" Name="installedStart" Type="integer" Value="1" KeyPath="yes"/>
      </Component>
    </DirectoryRef>

    <DirectoryRef Id="DesktopFolder">
      <Component Id="ApplicationShortcutDesk" Guid="***">
        <Shortcut Id="ApplicationStartDeskShortcut"
                  Name="$(var.product)"
                  Description="$(var.product) application"
                  Target="[#MyApplication.exe]"
                  WorkingDirectory="INSTALLFOLDER"/>
        <RemoveFolder Id="DesktopFolder" On="uninstall"/>
        <RegistryValue Root="HKCU" Key="SOFTWARE\$(var.compagny)\$(var.product)" Name="installedDesk" Type="integer" Value="1" KeyPath="yes"/>
      </Component>
    </DirectoryRef>

    <DirectoryRef Id="FontsFolder">
      <Component Id="InstallFonts" Guid="{***}" Permanent="yes">
        <File Id="OCRB_Medium.ttf" Source="$(var.SolutionDir)_Required\OCRB_Medium.ttf" TrueType="yes" />
        <File Id="OCRBS___.TTF" Source="$(var.SolutionDir)_Required\OCRBS___.TTF" TrueType="yes" />
      </Component>
    </DirectoryRef>
  </Fragment>

    <Fragment>
    <ComponentGroup Id="ProductComponents">
      <!-- Application -->
      <Component Id="ProductComponent" Guid="{***}" Directory="INSTALLFOLDER" UninstallWhenSuperseded="yes">
        <!-- DLL -->
        <File Id="Bitmap.Core.dll" Source="$(var._Delivery.TargetDir)..\bin\Bitmap.Core.dll"/>
        <File Id="PdfLib.dll" Source="$(var._Delivery.TargetDir)..\bin\PdfLib.dll"/>

        <!-- EXE -->
        <File Id="MyApplication.exe" Source="$(var._Delivery.TargetDir)..\bin\MyApplication.exe"/>
        <File Id="MyApplication.exe.config" Source="$(var._Delivery.TargetDir)..\bin\MyApplication.exe.config"/>
      </Component>

      <!-- fr -->
      <Component Id="FRComponent" Guid="{***}" Directory="fr" UninstallWhenSuperseded="yes">
        <File Id="resources-fr.dll" Source="$(var._Delivery.TargetDir)..\bin\fr\resources-fr.dll" />
      </Component>

      <!-- Settings -->
      <Component Id="SetComponent" Guid="{***}" Directory="SETTINGS" UninstallWhenSuperseded="yes">
        <File Id="Settings.xml" Source="$(var.MyApplication.ProjectDir)Settings\Settings.xml" />
      </Component>

      <!-- Printers -->
      <Component Id="PrintComponent" Guid="{***}" Directory="PRINTERS" UninstallWhenSuperseded="yes">
        <File Id="Sticker.xml" Source="$(var.MyApplication.ProjectDir)Settings\Printers\Sticker.xml" />
      </Component>

      <!-- Resources -->
      <Component Id="Drivers" Guid="{***}" Directory="Drivers" UninstallWhenSuperseded="yes">
        <File Id="drivers.exe" Source="$(var.SolutionDir)_Required\drivers.exe"/>
        <File Id="user_manual_E.pdf" Source="$(var.SolutionDir)_Required\user_manual_E.pdf"/>
      </Component>
        </ComponentGroup>
    </Fragment>
</Wix>

РЕДАКТИРОВАТЬ:

  • Старая версия этого кода прекрасно работала

  • Я напечатал журнал при удалении, и эта строка, кажется, связана с этой проблемой:

MSI (c) (E8: BC) [10: 58: 16: 769]: запрещение удаления компонента: {один из моих гидов}, поскольку существует другой клиент

2 ответа

WiX не удалит компоненты, которые, по его мнению, уже установлены, что, как я полагаю, имеет место в данном случае. Зачем?

  • Может быть повторное использование направляющих (убедитесь, что все они уникальны)
  • Возможно, более ранняя версия этого установщика помечала эти компоненты как постоянные в одной точке

Однако, что отличает ваш код от похожих вопросов, которые я видел по этой проблеме, так это то, что у вас нет File элементы, перечисленные как KeyPath к вашему компоненту. Поэтому я считаю, что родительский каталог по умолчанию становится KeyPath. KeyPath используется для определения того, установлен ли на компьютере компонент. Если для них KeyPath установлен в каталог, а каталог уже существует, то, скорее всего, он не будет удален при удалении, поскольку он уже установлен.

Как лучшая практика, попробуйте иметь один File в каждом Componentи в File набор элементов KeyPath="yes",

Похожие вопросы по этой теме:

Я наконец нашел то, что продолжалось. Моя установка работала, я установил приложение на свой компьютер.

Недавно я изменил имя моего Drivers каталог (не идентификатор). Я переустановил свое приложение (без удаления старого), и установка прошла нормально. После этого проблема действительно появилась.

Решение было простым:

  • удаление моего приложения с помощью меню Windows (было установлено 2 приложения)

Теперь установка / удаление отлично работает.

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