Wix 卸载不会删除文件
Wix uninstall does not remove files
我有一个带有 WiX 安装程序的 C# 项目。
当我安装我的应用程序时,一切正常。我有 :
- 程序文件 (x86) 中我的 compagny 文件夹,包含我的应用程序文件夹和驱动程序文件夹。
- 桌面快捷方式
- 开始菜单中的快捷方式
安装应用程序后,我可以 运行 我的 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]: Disallowing uninstallation of
component: {one of my guids} since another client exists
WiX 不会卸载它认为已经安装的组件,我假设这里就是这种情况。为什么?
- 可以重复使用 guid(确保它们都是唯一的)
- 可能是此安装程序的早期版本曾将这些组件标记为永久
但是,使您的代码与我在这个问题上看到的类似问题不同的是,您没有将任何 File
元素列为组件的 KeyPath
。因此,我相信父目录默认成为 KeyPath。 KeyPath 用于确定计算机上是否安装了组件。如果他们的 KeyPath 设置为目录,并且该目录已经存在,那么它可能不会在卸载时被删除,因为它已经安装了。
作为最佳实践,尝试在每个 Component
和 File
元素集 KeyPath="yes"
.
中有一个 File
关于此主题的类似问题:
- Removing files when uninstalling WiX
- Wix uninstall not removing files, always assumes program files\myApp folder
- Wix Not Removing Files on Uninstall
- WiX installer not removing files on uninstall
我终于知道是怎么回事了。我的安装工作正常,我在我的电脑上安装了应用程序。
最近,我修改了 Drivers
目录的名称(不是 Id)。我已经重新安装了我的应用程序(没有删除旧的)并且安装正常。之后,问题确实出现了。
解决方案很简单:
- 正在使用 Windows 菜单删除我的应用程序(安装了 2 个应用程序)
现在 install/uninstall 工作正常。
我有一个带有 WiX 安装程序的 C# 项目。
当我安装我的应用程序时,一切正常。我有 :
- 程序文件 (x86) 中我的 compagny 文件夹,包含我的应用程序文件夹和驱动程序文件夹。
- 桌面快捷方式
- 开始菜单中的快捷方式
安装应用程序后,我可以 运行 我的 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]: Disallowing uninstallation of component: {one of my guids} since another client exists
WiX 不会卸载它认为已经安装的组件,我假设这里就是这种情况。为什么?
- 可以重复使用 guid(确保它们都是唯一的)
- 可能是此安装程序的早期版本曾将这些组件标记为永久
但是,使您的代码与我在这个问题上看到的类似问题不同的是,您没有将任何 File
元素列为组件的 KeyPath
。因此,我相信父目录默认成为 KeyPath。 KeyPath 用于确定计算机上是否安装了组件。如果他们的 KeyPath 设置为目录,并且该目录已经存在,那么它可能不会在卸载时被删除,因为它已经安装了。
作为最佳实践,尝试在每个 Component
和 File
元素集 KeyPath="yes"
.
File
关于此主题的类似问题:
- Removing files when uninstalling WiX
- Wix uninstall not removing files, always assumes program files\myApp folder
- Wix Not Removing Files on Uninstall
- WiX installer not removing files on uninstall
我终于知道是怎么回事了。我的安装工作正常,我在我的电脑上安装了应用程序。
最近,我修改了 Drivers
目录的名称(不是 Id)。我已经重新安装了我的应用程序(没有删除旧的)并且安装正常。之后,问题确实出现了。
解决方案很简单:
- 正在使用 Windows 菜单删除我的应用程序(安装了 2 个应用程序)
现在 install/uninstall 工作正常。