如果删除文件,为什么MSI安装程序会重新配置?

时间:2011-05-12 16:30:29

标签: windows-installer

我在Visual Studio 2008中创建了一个MSI安装程序包。问题是安装后,如果删除任何已安装的文件。这不是我的安装程序包的预期行为。我的文件安装属性是:

PackageAs vsdpaDefault 永久错误 ReadOnly False 注册vsdrfDoNotRegister 系统错误 传递性错误 重要的错误

如果这是微不足道的,请原谅我。我无法相信我无法让谷歌放弃答案。 :)

3 个答案:

答案 0 :(得分:7)

Windows Installer 部署技术,其工作是安装指定的文件和注册表设置并将其保留在指定安装位置并确保它们是正确的版本 - 自我修复或弹性是实现此目的的机制。它的操作与开发人员需要动态交换文件以进行调试,开发和测试相冲突。

作为开发人员,您可能有兴趣部署MSI,然后即时删除或替换文件以进行调试。在这些情况下,MSI可能会令人讨厌,因为它永远不会停止工作,并会重新安装正确的文件。这被称为“自我修复”,可能非常烦人! : - 。)

有很多方法可以解决这个问题,MSI非常复杂。由于“自修复”通常是从“广告的快捷方式”调用的,因此避免此MSI功能的最简单方法是直接从文件系统启动EXE文件,而不是通过快捷方式启动。这绕过了除最复杂的EXE文件以外的所有MSI自修复机制。您还可以在桌面上手动创建一个不会触发自我修复的非广告快捷方式。

对于记录,自修复由“self-repair entry points”触发,用于密钥路径验证。它们包括广告快捷方式,文件关联,COM注册表数据等。

自我修复弹性还有很多其官方名称,请检查this comprehensive article on self-repair problems以找到解决特定问题的方法。这是一篇很长的文章,但如果你有自我修复的问题,应该值得一读。


  

更新,2018年10月

自我修复 :比任何人都想知道更多自我修复:

  1. Self-repair - explained
  2. Self-repair - finding real-world solutions
  3. Self-repair - how to avoid it in your own package
  4. 类似:Visual Studio 2015 msi build initiates another installation

答案 1 :(得分:2)

这是设计上的,称为“弹性”:http://www.msifaq.com/a/1037.htm

答案 2 :(得分:1)

我知道我对此事迟到了,但是我发现将'NeverOverwrite =“ yes”'添加到要在安装后修改的文件的Component定义中,会停止自我-避免撤消我的更改。

这几乎解决了我的自我修复问题。我将此添加到了MSI中的所有配置文件和批处理文件中。