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

9
我在Visual Studio 2008中创建了一个MSI安装程序包。问题在于,如果我删除任何已安装的文件,它不是我安装程序包的预期行为。我的文件安装属性如下:
PackageAs vsdpaDefault Permanent False ReadOnly False Register vsdrfDoNotRegister System False Transitive False Vital False 如果这很琐碎,请原谅我。我无法相信我无法让Google放弃答案。 :)
3个回答

11

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

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

有很多方法可以解决这个问题,MSI非常复杂。由于“自我修复”通常是从"广告快捷方式"调用的,避免此MSI功能的最简单方法是直接从文件系统启动EXE文件,而不是通过快捷方式启动。这将绕过大多数复杂EXE文件的MSI自我修复机制。您还可以在桌面上手动创建一个非广告快捷方式,它不会触发自我修复(右键单击可执行文件并同时按住右鼠标按钮,拖放到桌面上的空白处并释放按钮,然后单击“在此处创建快捷方式”)。

就记录而言,自我修复是由“自我修复入口点”触发的(这篇优秀的小文章已经消失了 - 也许如果您登录了仍然存在),用于关键路径验证。它们包括广告快捷方式文件扩展名关联文件MIME类型关联COM动词激活例如打开)、COM激活(注册表)和直接调用Windows Installer,甚至可能还有其他一些东西。

MSI广告。实质上,广告MSI安装程序没有被安装,而是在系统上注册,当通过“某种机制”(上面的入口点)调用时进行安装。

自我修复或弹性(官方名称)有很多要点,请查看{{link1:这篇关于自我修复问题的全面文章}},以找到解决您特定问题的方法。虽然这是一篇长文章,但如果您有自我修复问题,阅读它应该是值得的。


更新,2018年10月

自我修复详细介绍:有关自我修复的更多信息:

  1. 自我修复-说明
  2. 自我修复-寻找现实世界的解决方案
  3. 自我修复-如何避免在您自己的软件包中出现问题

链接:


1
请注意,还有许多其他方法可以避免触发修复操作。其中大部分不建议使用,但在某些情况下可以使用“非广告快捷方式”,例如创建版本供QA团队使用时。使用此类快捷方式不会触发自我修复操作。对于发布版本,我会启用广告快捷方式,因为自我修复是MSI的重要功能。 - Stein Åsmul

2

2
我知道我来晚了,但我发现在文件的组件定义中添加“NeverOverwrite =” yes“”可以防止自我修复撤消我的更改,特别是那些安装后打算修改的文件。
这几乎解决了我的自我修复问题。 我将其添加到MSI中所有配置文件和批处理文件中。

1
是的,但不要对想要更新的文件(如二进制文件或设置文件)这样做,否则在升级时您的安装程序将无法正确更新。更好的方法是,在安装后复制设置文件并写入它们,保留原始文件作为未经触碰的“模板”。我不确定**REINSTALLMODE=amus**(强制覆盖)是否会覆盖设置为“永不覆盖”的关键路径。我记得测试过,但不记得结果了 :-)。这就是当您没有把它写下来时会发生的事情。感谢分享您的提示! - Stein Åsmul

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接