C# Wix不';如果我删除了我的文件,我就不会删除它的文件

C# Wix不';如果我删除了我的文件,我就不会删除它的文件,c#,wix,custom-action,C#,Wix,Custom Action,我有一个Wix安装程序,如果我不执行我的自定义操作,它可以很好地安装和删除。但是如果我执行了它们,那么我的自定义操作就完成了它的工作,卸载也成功了,但是安装的所有文件都保留在program files应用程序目录中 在安装时,我的自定义操作(After=“InstallFiles”)将许多文件从Zip文件提取到主安装目录下的目录中。我还捕获了提取(添加)的所有文件的列表。这很好用 卸载时,我的自定义操作(在=“msiumpublishassemblies”)将在列表中运行,并删除添加的文件、添加

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

在安装时,我的自定义操作(After=“InstallFiles”)将许多文件从Zip文件提取到主安装目录下的目录中。我还捕获了提取(添加)的所有文件的列表。这很好用

卸载时,我的自定义操作(在=“msiumpublishassemblies”)将在列表中运行,并删除添加的文件、添加的子目录和文件列表本身。这工作正常-我添加的文件被删除。但是,即使安装程序完成了所有步骤(从日志文件中可以看出),并且成功地结束了,安装程序最初安装的主文件仍然会被保留

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

谢谢

更新: 我已经尝试用蛮力的方式解决了这个问题,但我仍然想要一个真正的答案。这是我的暴力代码。我用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();
    }

从嵌入的zip中提取文件的方法不是我会放在MSI中的方法。相反,我希望应用程序在启动时提取zip—更可控、更可靠。事实上,我不建议进行任何解压缩,但有时数据文件需要进行解压缩


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

提取ZIP确实不是最好的方法,除此之外,您只需使用元素让Windows Installer在卸载过程中删除文件。

我们有多个功能,每个功能都需要从它们自己的大量数据文件副本开始。我尽量不将此集合多次放入安装程序。解压可以很好地安装这些功能。回答您的问题:“‘立即’”,在MSIunPublishaAssemblies*synchronous(check)*之后,如果没有“remove”CA,卸载可以工作,但将解压的文件留在后面*我没有启用“legacy shareddll ref count”功能,也许我可以尝试为每个功能生成“RemoveFile”元素的片段组件。感谢您的回复!