0

我有一个 Wix 安装程序,如果我不执行我的自定义操作,它可以很好地安装和删除。但是,如果我确实执行了它们,那么我的自定义操作就可以完成它的工作,并且卸载确实成功,但是安装的所有文件都保留在程序文件应用程序目录中。

安装时,我的自定义操作 (After="InstallFiles") 将一些文件从 Zip 提取到主安装目录下的目录中。我还捕获了提取(添加)的所有文件的列表。这完美地工作。

卸载时,我的自定义操作 (After="MsiUnpublishAssemblies") 会遍历列表并删除添加的文件、添加的子目录和文件列表本身。这工作正常 - 我添加的文件被删除。但是,即使安装程序完成了所有步骤(据我从日志文件中得知)并成功结束,安装程序最初安装的主要文件仍然存在。

任何想法在这里都会有很大的帮助。

谢谢!

更新:我暂时用蛮力的方式解决了这个问题,但我仍然想要一个真正的答案。这是我的蛮力代码。我用我的 InstallDir 的 DirectoryInfo 来调用它。

    private static void CleanupTheRest(DirectoryInfo dirInfo)
    {
        // until I figure out why the unistall won't remove these after executing my CA
        foreach (var subDirInfo in dirInfo.GetDirectories())
        {
            CleanupTheRest(subDirInfo);
        }
        foreach (var file in dirInfo.GetFiles())
        {
            file.Delete();
        }
        dirInfo.Delete();
    }
4

2 回答 2

1

提取 ZIP 确实不是解决问题的最佳方式,除此之外,您只需要使用RemoveFile元素让 Windows Installer 在卸载期间删除文件。

于 2009-09-28T06:11:22.540 回答
0

您用于从嵌入式 zip 中提取文件的方法不是我会放入我的 MSI 的方法。相反,我会让应用程序在启动时提取 zip - 更加可控和可靠。实际上我根本不建议解压缩,但有时对数据文件是必要的。

您如何安排删除操作?立即/延迟?你使用同步还是异步运行模式?如果您注释掉您的卸载自定义操作,卸载是否有效?如果您启用了“legacy shareddll ref-count”功能,您可能在注册表中有垃圾引用计数:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\SharedDLLs(如果是这样,请删除条目并重试 - 这可能会使卸载按预期工作)。

于 2009-09-25T02:44:09.273 回答