Wix安装程序 - 如何定义卸载方式

3
我已经创建了我的第一个Wix设置到我的C#项目中(我对wix不太熟悉)。
该设置创建了一个MSI文件,该文件运行良好。安装完成后,所有的DLL和.EXE文件都被创建在“C:\Program Files (x86)\MyApplication”目录下。
但是当我右键点击MSI并选择卸载时,虽然显示了一个无误的卸载菜单,但是"C:\Program Files (x86)\MyApplication"文件夹没有被删除。
如何定义卸载功能以删除此文件夹?
以下是我的Product.wxs一部分内容:
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"
     xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">
  <Product Id="*"
           Name="My Application"
           Language="1033"
           Version="1.0.0.0"
           Manufacturer="Me"
           UpgradeCode="36944ae1-9e9f-4ef0-a860-9d894e0c28ef">
    <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="My Application" Level="1">
      <ComponentGroupRef Id="ProductComponents"/>
      <ComponentRef Id ="ApplicationShortcut"/>
      <ComponentRef Id ="ApplicationShortcutDesk"/>
      <ComponentRef Id ="RemoveAll"/>
    </Feature>
  </Product>

  <Fragment>
    <Directory Id="TARGETDIR" Name="SourceDir">
      <Directory Id="ProgramMenuFolder">
        <Directory Id="ApplicationProgramsFolder" Name="My Application"/>
      </Directory>
      <Directory Id="DesktopFolder" SourceName="Desktop"/>
      <Directory Id="ProgramFilesFolder">
        <Directory Id="INSTALLFOLDER" Name="My Application">
          <Directory Id="fr" Name="fr"/>

          <Component Id="RemoveAll" Guid="{63F6943C-7707-41CA-BAB9-7438471EC81E}">
            <RemoveFile Id="RemoveAllFilesOnUninstall" Directory="INSTALLFOLDER" Name ="*.*" On ="uninstall"/>
            <RemoveFolder Id="RemoveAllFoldersOnUninstall" Directory="INSTALLFOLDER" On="uninstall"/>
            <RegistryValue Root="HKLM" Key="Software\Microsoft\MyApplication" Name="Path" Type="string" Value="[INSTALLFOLDER]" KeyPath="yes" />
            <util:RemoveFolderEx On="uninstall" Property="INSTALLFOLDER" />
          </Component>
        </Directory>
      </Directory>
    </Directory>
  </Fragment>

  <Fragment>
    <DirectoryRef Id="ApplicationProgramsFolder">
      <Component Id="ApplicationShortcut" Guid="{3B0B5064-807C-4E29-A701-E77BE8B8FA86}">
        <Shortcut Id="ApplicationStartMenuShortcut"
                  Name="My Application"
                  Target="[#MyApplication.exe]"
                  WorkingDirectory="INSTALLFOLDER"/>
        <RemoveFolder Id="ApplicationProgramsFolder" On="uninstall"/>
        <RegistryValue Root="HKCU" Key="Software\Microsoft\MyApplication" Name="installed" Type="integer" Value="1" KeyPath="yes"/>
      </Component>
    </DirectoryRef>
    <DirectoryRef Id="DesktopFolder">
      <Component Id="ApplicationShortcutDesk" Guid="{61087C99-9CA8-4191-8251-219DFDAFC666}">
        <Shortcut Id="ApplicationStartDeskShortcut"
                  Name="My Application"
                  Target="[#MyApplication.exe]"
                  WorkingDirectory="INSTALLFOLDER"/>
        <RemoveFolder Id="DesktopFolder" On="uninstall"/>
        <RegistryValue Root="HKCU" Key="Software\Microsoft\MyApplication" Name="installed" Type="integer" Value="1" KeyPath="yes"/>
      </Component>
    </DirectoryRef>
  </Fragment>

  <Fragment>
    <ComponentGroup Id="ProductComponents">
      <Component Id="ProductComponent" Guid="{5C62E31A-C787-4B45-A4F7-2324A12C72D1}" Directory="INSTALLFOLDER">
        <!-- List of DLL/EXE -->
    </ComponentGroup>
  </Fragment>
</Wix>

编辑:我现在使用UtilExtensionINSTALLFOLDER已经正确删除。唯一需要重命名的是ApplicationShortcutDeskApplicationStartMenuShortcut。对于快捷方式来说,RemoveFolder是如何工作的?


为什么要使用自定义操作来实现这个目的?当您卸载产品时,安装程序会删除自己创建的所有文件。这是默认行为。也许您在“文件”标记中意外地使用了“永久”属性? - Anton Sutarmin
1
另外,我建议您在卸载过程中生成日志。这对于问题检测非常有帮助。为此,请像往常一样安装您的MSI,然后运行msiexec /x msiname.msi /l*v uninstall.log进行卸载。 - Anton Sutarmin
我终于找到了一种方法,通过使用UtilExtension(你说得对,自定义操作是个坏主意)。安装文件夹现在已被删除!我只需要删除创建的两个快捷方式。 - A.Pissicat
2
我再说一遍。在卸载时,安装程序不删除自己创建的文件的情况是不正常的。也许你可以找出这种行为的原因... - Anton Sutarmin
我看到了这篇帖子。我尝试更改所有GUID并删除我的组件“RemoveAll”。现在一切都很好。我真的不明白问题出在哪里,因为今天早上我自己生成了所有GUID,并且现在使用相同的方法它可以工作了。至少感谢您的帮助,我开始变得疯狂,为此浪费了整整一天的时间。 - A.Pissicat
显示剩余3条评论
1个回答

5

多亏了Anton Sutamin,我终于找到了问题所在。

我的GUIDs阻止了文件的删除(请参见该帖子)。

使用新的GUIDs,一切都正常工作,无需CustomAction / RemoveFile等操作...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接