Wix 卸载不删除文件,始终假定程序文件\myApp 文件夹

2024-02-16

我在使用 Wix 安装程序时遇到问题,并且不知道具体缺少什么。 我已启用该对话框以允许用户选择自己的安装文件夹而不是默认的安装文件夹

如果我运行安装并保留默认的“Program Files\MyApp”,则应用程序安装没有问题。如果我随后卸载,所有文件和文件夹都会正确删除。

如果我运行安装并将默认值更改为 c:\TestFolder\MyApp 之类的内容,则它安装到该位置没有问题,并且包含具有各自内容的 Java64bit 和 Java64bit/lib 文件夹的子文件夹。

然后,如果我立即进行卸载,它会正确地完全删除 Java 内容,但会将所有文件保留在 c:\TestFolder\MyApp 根目录中。

安装后查看注册表,它确实显示了正确的安装目录位置。我还能提供什么来帮助解决这个问题。

这是不同文件的完整安装(已删除 GUID)

主要(样品)产品的文件

<?xml version="1.0" encoding="utf-32BE"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
    <Product
        Name="AMyApp"
        Manufacturer="Testing"
        Language="1033"
        Version="1.0.1.0"
        Id="*"
        UpgradeCode="{GUID1}" >

        <?include AMyApp_Define_Paths.wxi ?>

        <Package 
            Id="*"
            InstallerVersion="200"
            Platform="x64"
            Compressed="yes"
            Languages="1033"
            SummaryCodepage="1252"
            Comments="AMyApp Package Comments area"
            Description ="AMyApp"
            InstallScope="perMachine" />

        <MajorUpgrade 
            AllowDowngrades="no"
            AllowSameVersionUpgrades="yes"
            DowngradeErrorMessage="A newer version of AMyApp is already installed." />

        <Property Id="PREVIOUSVERSIONSINSTALLED" Secure="yes" />

        <Upgrade Id="{GUID1}">
            <UpgradeVersion
               Minimum="4.0.0.0" Maximum="99.0.0.0"
               Property="PREVIOUSVERSIONSINSTALLED"
               IncludeMinimum="yes" IncludeMaximum="no" />
        </Upgrade>

        <Media Id="1" 
            Cabinet="AMyApp.cab" 
            EmbedCab="yes" />

        <WixVariable Id="ALLUSERS" Value="2" />
        <WixVariable Id="MSIINSTALLPERUSER" Value="" />

        <!-- see if location from a previously installed instance. -->
        <Property Id="INSTALLDIR" >
            <RegistrySearch Id="AMYAPP" Type="raw"
              Root="HKLM" Key="SOFTWARE\AMYAPP" Name="InstallDir" />
        </Property>
        <Property Id="WIXUI_INSTALLDIR" Value="INSTALLDIR" />

        <!-- Search registry for previous installed location -->
        <Property Id="PREVIOUSINSTALLFOLDER">
            <RegistrySearch Id="GetPreviousInstallFolder" Root="HKLM"
               Key="SOFTWARE\AMYAPP" Name="INSTALLDIR" Type="raw" />
        </Property>

        <CustomAction Id="SetINSTALLDIR"  Property="INSTALLDIR" 
            Value="[PREVIOUSINSTALLFOLDER]" Execute="firstSequence" />
        <CustomAction Id="SetWIXUI_INSTALLDIR"  Property="WIXUI_INSTALLDIR" 
            Value="[PREVIOUSINSTALLFOLDER]" Execute="firstSequence" />
        <InstallExecuteSequence>
            <Custom Action="SetINSTALLDIR"
               After="AppSearch">PREVIOUSINSTALLFOLDER</Custom>
            <Custom Action="SetWIXUI_INSTALLDIR" 
               After="AppSearch">PREVIOUSINSTALLFOLDER</Custom>
        </InstallExecuteSequence>
        <InstallUISequence>
            <Custom Action="SetINSTALLDIR" 
               After="AppSearch">PREVIOUSINSTALLFOLDER</Custom>
            <Custom Action="SetWIXUI_INSTALLDIR" 
               After="AppSearch">PREVIOUSINSTALLFOLDER</Custom>
        </InstallUISequence>

        <Directory Id="TARGETDIR" Name="SourceDir" >
            <!-- The directories "DesktopFolder", "FontsFolder", "ProgramFilesFolder" 
              are all pre-defined common names via the installer and reference the 
              actual windows locations respectively -->
            <Directory Id="DesktopFolder" />
            <Directory Id="FontsFolder" />
            <Directory Id="ProgramFiles64Folder" >
                <!-- The "ID" is the name internally that refers to the folder when
                  trying to install files, etc... the "Name" is what the actual name 
                  will be at actual install time as viewed by Windows Explorer -->
                <Directory Id="INSTALLDIR" Name="AMYAPP" >
                    <Component Id="C_HKLM_AMyAppUsage" Guid="{GUID2}">
                        <RegistryKey Root="HKLM" Key="SOFTWARE\AMyApp" >
                            <RegistryValue Name="IsSomeKey" Type="string" Value="YES" KeyPath="yes" />
                        </RegistryKey>
                    </Component>
                    <Directory Id="Java64BitDIR" Name="Java64Bit" >
                        <Directory Id="Java64BitLibDIR" Name="Lib" />
                    </Directory>
                </Directory>
            </Directory>
        </Directory>

        <Feature Id="AMyApp_Features"
            Title="AMyApp (Wix Testing)"
            Level="1"
            ConfigurableDirectory="INSTALLDIR" >

            <ComponentRef Id="C_HKLM_AMyAppUsage" />

            <ComponentRef Id="AMyApp_CORE" />
            <ComponentRef Id="AMyApp_Shortcuts" />
            <ComponentRef Id="JAVA64BIT_Support" />
            <ComponentRef Id="JAVA64BITLIB_Support" />
        </Feature>

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

            <!-- Skip license dialog -->
            <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>

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

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

        <Property Id="LAUNCHAPPONEXIT" Value="1" />
    </Product>
</Wix>

Java 子文件夹示例的片段文件

<?xml version="1.0" encoding="utf-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
    <Fragment>
        <?include AMyApp_Define_Paths.wxi ?>
        <DirectoryRef Id="Java64BitDIR">
            <Component Id="JAVA64BIT_Support" Guid="{GUID1a}">
                <File Id="_64_javax.comm.properties" Source="$(var.Path_Java64Bit)\javax.comm.properties" />
            </Component>
        </DirectoryRef>
        <DirectoryRef Id="Java64BitLibDIR">
            <Component Id="JAVA64BITLIB_Support" Guid="{GUID2a}">
                <File Id="_64_HardwireDriver.jar" Source="$(var.Path_Java64BitLib)\HardwireDriver.jar" />
            </Component>
        </DirectoryRef>
    </Fragment>
</Wix>

安装在根文件夹中的常用内容的片段文件

<?xml version="1.0" encoding="utf-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" >
    <Fragment>
        <DirectoryRef Id="INSTALLDIR">
            <Component Id="AMyApp_CORE" Guid="{GUID1c}" Win64="yes">
                <?include AMyApp_Define_Paths.wxi ?>

                <RegistryKey 
                    Root="HKLM" 
                    Key="SOFTWARE\AMyApp" 
                    ForceCreateOnInstall="yes" 
                    ForceDeleteOnUninstall="yes" >

                    <RegistryValue Type="string" Name="InstallDir" Value="[INSTALLDIR]"/>
                    <RegistryValue Type="string" Name="MyAppContext" Value="Testing"/>
                </RegistryKey>

                <RemoveFile Id="RemoveAllMyAppFiles" Name="*.*" On="uninstall" />
                <RemoveFolder Id="INSTALLDIR" On="uninstall" />

                <File Id="MyApp.exe" Source="$(var.Path_MyAppReleaseFolder)\MyApp.exe" />
            </Component>
        </DirectoryRef>
    </Fragment>
</Wix>

这是我想出的一个简化的解决方法,但不知道为什么它会在幕后做这些事情,但有效。

声明期间<UI>段,我刚刚将“Welcome”和“MaintenanceWelcome”对话框更改为都转到“Install Directory”对话框。它显然绕过了“修复”/“卸载”的路径,但将允许安装程序处理其自己的原始文件删除并从安装程序重新发布新文件。

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

    <!--<Property Id="WixUI_Mode" Value="InstallDir" />-->

    <!-- Skip license dialog -->
    <Publish Dialog="WelcomeDlg"
             Control="Next"
             Event="NewDialog"
             Value="InstallDirDlg"
             Order="2">1</Publish>

    <!-- Send the MAINTENANCE Dialog to the same Install Dir dialog -->
    <Publish Dialog="MaintenanceWelcomeDlg"
             Control="Next"
             Event="NewDialog"
             Value="InstallDirDlg"
             Order="2">1</Publish>

   ...
</UI>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Wix 卸载不删除文件,始终假定程序文件\myApp 文件夹 的相关文章

随机推荐

  • 导入头文件的问题

    我正在将 Objective C 项目导入到我的 swift 项目中 我已经创建了桥接头并在 构建设置 下设置了路径 我已将搜索路径设置为头文件和库 问题是找不到我的头文件 当我构建时 找不到导入中的第二行 import VuforiaOb
  • 开发通用 Android 应用程序(手机和平板电脑)

    我正在开发一个通用的 Android 应用程序 我需要检查该应用程序是否在平板电脑或手机中运行 有什么方法可以做到吗 您可以检查Android 版 Google I O 应用程序 http code google com p iosched
  • 为什么 select2-removing 事件在带有allowClear的select2中没有触发?

    我想在我的中挂钩一个事件select2 http ivaynberg github io select2 documentation一旦它被清除 select2 初始化为allowClear true 然而事件 select on sele
  • Ionic 应用程序适用于 ios,但不适用于 Android

    我的应用程序可以在 ios 设备上与 ionicserve ionicview 和 ionicbuildios 配合使用 我的应用程序也可以在 Android 上的 ionic 视图中正常工作 但是 当我运行 ionic run andro
  • 在heroku上运行loaddata而不将数据文件添加到存储库

    我需要运行一个manage py loaddata命令将一些数据导入到我的heroku实例的数据库中 而heroku的ethereal文件系统在这方面出现了一些问题 我真的不想将数据文件添加到我的heroku存储库中 并在每次我想运行loa
  • Java:d​​ouble:如何始终显示两位小数

    我在项目中使用双精度值 并且我希望始终显示前两位小数 即使它们为零 我使用此函数进行舍入 如果我打印的值是 3 47233322 它 正确地 打印 3 47 但是 例如 当我打印值 2 时 它会打印 2 0 public static do
  • 在 Servlet 中使用 CDI 注入

    我正在尝试 Inject a SessionScoped将 bean 放入过滤器 WebFilter public class IdentityFilter implements Filter Serializable Inject pri
  • 未找到 Java 类的消息正文编写器

    我刚开始使用 JAX RS 并编写了一个输出 json 对象的示例应用程序 但我有一个例外 这是我的代码 Path hello public class HelloWorldService GET Path query artist id
  • 那么我在这里谈论的是 SOA 吗?

    对于政府合同 我们将建议建立一个交通监控架构 我们将有以下组件 摄像机设置在感兴趣区域周围 摄像机将了解它们的位置和方向以及观看参数 GIS地图服务器 可以查询街道 建筑物等 一种算法接收原始视频和街道位置信息并输出汽车位置 另一种算法接收
  • 检查字符串是否包含列表中的元素的更智能方法 - python

    List top brands包含品牌列表 例如 top brands Coca Cola Apple Victoria s Secret items is a pandas DataFrame结构如下图所示 我的任务是填写brand na
  • Visual Studio 2008 类视图缺少类

    我刚刚将一个大型项目从旧版本的 Visual C 移植到 VS2008 并注意到类视图缺少一些我的类 查看解决方案视图 声明这些类的头文件存在 因此我希望在类视图中看到它们 排除某些类的任何原因 或者有什么方法可以刷新类视图以包含解决方案中
  • shiny,DT,styleColorBar 正值和负值的颜色不同?

    我已阅读 DT pdf 文档并进行了搜索 但 DT 包似乎不支持不同的颜色 我怎样才能达到下面图片链接所示的效果 谢谢 示例 正值和负值使用不同的颜色 https asymmetryobservations files wordpress
  • 将 copts/defines 传播到目标的所有依赖项

    我有一个项目 在一个相当复杂的构建系统中的单个工作空间中涉及多个构建文件 简而言之 我的目标 对于某些特定目标 我希望使用一组额外的属性来构建其所有递归依赖项 copts defines 与以任 何其他方式构建这些依赖项目标时相比 我还没有
  • 在 BIN 文件夹中找不到 ApacheJMeterTemporaryRootCA.crt

    我无法在 bin 文件夹中看到 ApacheJMeterTemporaryRootCA crt 文件 我正在运行 jmeter 5 2 1 我需要对此进行排序 以便能够将认证添加到对服务器的 API 调用中 请提供任何帮助或为我指明正确的方
  • 在 C# 中存储永远不会改变的静态数据的最佳方法是什么

    我有一个类将数据存储在 asp net c 应用程序中 并且永远不会改变 我真的不想将这些数据放入数据库中 我希望它保留在应用程序中 这是我在应用程序中存储数据的方法 public class PostVoteTypeFunctions p
  • 从html中提取标题标签

    我想从 html 字符串中提取标题标签的内容 我已经进行了一些搜索 但到目前为止我无法在 VB C 或 PHP 中找到此类代码 此外 这应该适用于大写和小写标签 例如应该与两者一起使用和 TITLE gt 谢谢 您可以为此使用正则表达式 但
  • 如何在 Haskell 中进行嵌套“循环”

    我正在查看一些 JAVA 代码 我想知道如何将其转换为 Haskell IntStream range 0 cookedWords length parallel forEach int i gt int A cookedWords i f
  • 在视图中播放框架配置值

    我如何访问该值application name from conf application conf在一个视图中 您可以使用以下代码示例来执行此操作 play configuration application name 另请参阅http
  • 如何使用 postData 过滤器刷新 jqGrid 搜索对话框

    我正在使用 jqGrid 到目前为止一切都运行良好 但现在我正在努力允许用户能够保存他们的搜索 以便他们以后可以检索它们和 或将它们应用到不同的网格 事实证明 节省实际上是最容易的部分 我可以根据指定的 postData 过滤器获取网格进行
  • Wix 卸载不删除文件,始终假定程序文件\myApp 文件夹

    我在使用 Wix 安装程序时遇到问题 并且不知道具体缺少什么 我已启用该对话框以允许用户选择自己的安装文件夹而不是默认的安装文件夹 如果我运行安装并保留默认的 Program Files MyApp 则应用程序安装没有问题 如果我随后卸载