9

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

PackageAs vsdpaDefault Permanent False ReadOnly False Register vsdrfDoNotRegister System False Transitive False Vital False

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

4

3 回答 3

10

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

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

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

为了记录,自我修复是由“自我修复入口点”触发的,用于密钥路径验证。它们包括广告的快捷方式、文件关联、COM 注册表数据等。

自我修复还有很多其他功能,或者它的正式名称是弹性,请查看这篇关于自我修复问题的综合文章,以找到解决您特定问题的方法。这是一篇很长的文章,但是如果您有自我修复的问题,应该值得一读。


更新,2018 年 10 月

自我修复详细信息:比任何人都想了解的自我修复更多:

  1. 自我修复 - 解释
  2. 自我修复 - 寻找现实世界的解决方案
  3. 自我修复 - 如何在您自己的包裹中避免它

链接

于 2011-05-12T20:20:19.677 回答
2

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

于 2011-05-12T19:30:18.803 回答
2

我知道我迟到了,但我发现将“NeverOverwrite="yes"' 添加到打算在安装后修改的文件的组件定义中,停止自我修复撤消我的更改。

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

于 2018-12-18T16:33:12.350 回答