Wix卸载不会删除文件

时间:2017-09-13 08:56:12

标签: c# wix wix3.10

我有一个带有WiX安装程序的C#项目。

当我安装我的应用程序时,一切正常。我有:

  • 程序文件(x86)中的compagny文件夹,包含我的应用程序文件夹和drivers文件夹。
  • 桌面
  • 中的快捷方式
  • 开始菜单中的快捷方式

安装应用程序后,我可以运行我的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]:不允许卸载   组件:{我的一个guid},因为另一个客户端存在

2 个答案:

答案 0 :(得分:1)

WiX不会卸载它认为已安装的组件,我认为这是这种情况。为什么呢?

  • 可以重复使用guids(确保它们都是唯一的)
  • 可能是此安装程序的早期版本,将这些组件标记为一个永久性

但是,除了我在此问题上看到的类似问题之外,您的代码与您的组件的File没有列出任何KeyPath个元素。因此,我认为父目录默认成为KeyPath。 KeyPath用于确定计算机上是否安装了组件。如果他们将KeyPath设置为目录,并且该目录已经存在,则可能在卸载时不会删除,因为它已经安装。

作为最佳做法,请尝试在每个FileComponent元素集File中设置一个KeyPath="yes"

关于此主题的类似问题:

答案 1 :(得分:0)

我终于找到了发生的事情。我的安装工作正常,我在我的计算机上安装了应用程序。

最近,我修改了Drivers目录的名称(不是Id)。我已经重新安装了我的应用程序(没有删除旧版本)并且安装正常。之后,问题出现了。

解决方案很简单:

  • 使用Windows菜单删除我的应用程序(已安装2个应用程序)

现在安装/卸载工作正常。