2009-09-24 85 views
0

我有一个Wix安装程序,安装并删除罚款,如果我不执行我的自定义操作。但是,如果我确实执行了它们,那么我的自定义操作就会完成它的工作,并且卸载成功,但是所有安装的文件仍保留在程序文件应用程序目录中。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(); 
    } 

回答

0

你用来从嵌入式压缩文件中提取文件的方法并不是我将放入我的MSI。相反,我会让应用程序在启动时提取压缩文件 - 更加可控和可靠。实际上我不会推荐任何解压缩,但有时它对于数据文件是必要的。

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

+0

我们有多个功能,每个功能都需要从大量数据文件的副本开始。我试图不把这个集合多次放入安装程序。解压缩非常适合安装功能。要回答你的问题: *'立即',MsiUnpublishAssemblies后 *同步(检查) *没有“删除”CA的卸载工程,但留下的解压缩文件 *我没有启用“遗留shareddll参考计数“功能 也许我可以尝试为每个功能生成一个”RemoveFile“元素的片段组件。 感谢您的回复! – 2009-09-26 15:24:33

1

提取ZIP真的不是解决问题的最佳方式,不过您只需使用RemoveFile元素让Windows Installer在卸载过程中删除文件。