2
votes

I have created a my first Wix Setup to my C# project (i'm beginner with wix).

The setup create a msi file, this file works good. After setup all DLL and .exe are created in "C:\Program Files (x86)\MyApplication"

But when I right click on msi and select uninstall, a uninstall menu is displayed without error but folder "C:\Program Files (x86)\MyApplication" is not removed.

How can I define uninstall function to remove this folder ?

There is a part of my 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>

Edit: I'm now using UtilExtension and the INSTALLFOLDER is now correctly deleted. The only elements renaming are the ApplicationShortcutDesk and the ApplicationStartMenuShortcut. How the RemoveFolderworks for a shortcut ?

1
Why do you use custom action for this purpose? When you uninstalIing your product, installer removes all files created by itself. This is default behaviour. Maybe you accidentally used "Permanent" attribute with your "File" tags? - Anton Sutarmin
Also, I recommend you to generate log during uninstalling. It is very helpful for problem detection. For this, install your msi as usual and then run msiexec /x msiname.msi /l*v uninstall.log for uninstalling. - Anton Sutarmin
I have try without custom action, nothing is deleted and I have no Permanent attribute with file tag. My file tags are all like this <File Id="logo.JPG" Source="$(var.MyApplication.ProjectDir)\logo.JPG"/> (I added a log in my question) - A.Pissicat
Remove custom action from your installer. It may cause side errors which making harder to find out main reason. Also attach please entire log file. It will help to find out why your files doesn't removing in standard way during uninstallation. - Anton Sutarmin
I'll say it one more time. Situation, when installer doesn't remove it's own created files during uninstallation IS NOT NORMAL. May be you might find out the reason of this behaviour... - Anton Sutarmin

1 Answers

2
votes

Because of Sutamin Anton I finally found what was going wrong.

My GUIDs prevented the removal (see on that post)

With new GUIDs, all works good, without CustomAction/RemoveFile/etc...