通过WIX生成的MSI不会在卸载时删除应用程序根文件夹

时间:2015-05-04 05:48:58

标签: wix windows-installer msiexec

我无法让MSI删除我的根应用程序文件夹。除根文件夹外,所有文件都在卸载时正确删除。 MSI由WIX Toolset生成。奇怪的是,只有我们的构建服务器抛出的MSI才会发生这种情况。在我的本地计算机上生成的MSI工作正常,他们正确地清理应用程序文件夹。我在详细模式下运行卸载但找不到任何令人担忧的东西。

过去,即使我的本地机器MSI也无法正常工作。但我添加了KeepEmptyDirectories =" true" GenerateGuidsNow ="真"在.wixproj中 - 如果这是一个有用的信息。我该如何解决这个问题?我应该寻找哪些可能的红旗?

3 个答案:

答案 0 :(得分:0)

我会做几件事:

  1. 深入了解组件规则及其含义。 (当你打破它们时出了什么问题。)

  2. 检查卸载日志文件,找出Windows Installer选择不删除文件夹的原因的线索。

  3. 在清洁机器上进行测试。 (VM快照最简单。)

  4. 虽然有些人可以幸运,但我不建议使用任何类型的动态wxs代码生成,但动态ProductCode除外,以支持主要升级。这包括从组件的动态guid到组件收集(也称为动态文件链接)的所有内容。这些往往最终会破坏组件规则的副作用,包括你在这里看到的内容。

    也就是说,我理解手工编写WiX XML的痛苦,我在CodePlex上有一个名为IsWiX的开源项目。它由项目模板(脚手架)和图形设计器组成,极大地帮助创作和维护WiX项目。然后,您可以根据需要手动编辑XML,以声明IsWiX尚未处理的内容。

答案 1 :(得分:0)

听起来文件夹本身有锁。您是否正在运行卸载时停止的任何服务?您是否正在运行任何自定义操作,从根文件夹加载文件作为其操作的一部分?您是否在根目录ACL上设置了任何自定义权限?根文件夹是IIS文件夹吗?您是否尝试在卸载后重新启动以查看该文件夹是否仍然存在?

答案 2 :(得分:0)

显而易见的第一步是确保服务在卸载之前被正确停止。这种行为可能在不同的盒子上有所不同(但听起来你在同一个盒子上测试)。请参阅此主题:http://forum.installsite.net/index.php?showtopic=16458

接下来,尝试对MSI文件本身及其提供/安装的文件夹进行一些差异,以验证可能有什么不同(如果有的话)。

尝试在两个不同的MSI文件中使用 Wix工具包中的 dark.exe 。这会将它们解码为Wix XML,然后使用比较工具,例如 Beyond Compare 或类似的磁盘差异工具,来确定它们之间是否存在任何显着差异。

超越http://www.scootersoftware.com/的比较 - 是一个出色的工具(显然没有任何隶属关系)。我一直使用它,它的实用性是立竿见影的,所有使用文件的专业人员每天都会受益。 试一试See a screenshot

同样在已安装的文件夹上运行文件差异,以查看是否存在任何明显的差异。请特别注意配置文件并执行完整的二进制级别差异(不仅仅是CRC /哈希)。

HKCU HKLM 导出您的注册表配置单元(仅适用于您的应用,而不是整个注册表)并在之前和之后进行比较也是州(4出口)。

至于机器之间的差异 - 听起来你正在使用测试虚拟,但我只是想补充一点,即使其他一切都是相同的,你的盒子上的visual studio的存在也会影响到它。除此之外,硬件,网络和防火墙配置听起来都是一样的,并且您正在测试盒上进行测试。

您是否尝试过使用dependency walker?我从未将它用于服务,但分析选项对于检查一般应用程序(how-to)非常有用。