问题描述
在某些情况下,我们的应用程序中的文件更改了名称,而开发人员直到我们的产品安装中断后才会告诉我(通常这种情况发生在 VB6 项目破坏二进制兼容性并且开发人员必须将文件名更改为避免 DLL 地狱)。在这些情况下,通过将新文件放入已部署的应用程序副本中来查看它是否有效,然后再努力拉起 InstallShield 并使用新文件(大多数情况下,当我在干净的 VM 上进行冒烟测试时会出现此类问题,因此我有一个现成的测试环境)。这里的问题是大多数名称更改的文件都被标记为MSI 中文件组件中的一个关键文件,因此当我删除该文件并运行我们的应用程序时,它会触发修复,Windows 将其放回并否定测试的值。
部署应用程序后,是否可以从文件中删除密钥文件状态以防止 Windows 触发修复(如果文件系统中不存在该文件)?因为它是 MSI,所以我认为注册表中的某处有一个标志来跟踪密钥文件?
解决方法
有几个选项:
您应该在删除之前取消注册要删除的 COM 文件。然后注册新的。请注意,一旦完成注册,您绝不能通过其原始宣传的快捷方式启动该应用程序(这将使注册恢复原状)。
-
直接启动二进制文件:最简单的方法是转到文件夹并删除要删除的文件,将新文件放置到位并启动来自 Windows 资源管理器的主应用程序 binary.exe 而不是通过快捷方式。这将绕过大多数 self-repair entry points(有一些仍然可以启动)。
-
非广告快捷方式:您还可以删除应用程序二进制文件的原始快捷方式,然后创建一个新的非广告快捷方式(只是一个常规快捷方式 -
1)
右键单击并按住主应用程序二进制文件,2)
拖放到空白桌面区域并释放按钮,3)
选择“在此处创建新快捷方式”)。在大多数情况下,通过这个新的快捷方式启动您的应用程序不会调用自我修复。无论如何,仍有几种方法可以启动自我修复(如上所述)。有关更多信息,请参阅:"Self-repair entry points"(可以触发自我修复的事物)。
自我修复:Here is an overview on self-repair and its purpose。在该答案中还有指向有关该主题的大量信息的进一步链接。让我在此处内嵌最相关的:1)
Explanation of the concept、2)
Finding real-world solutions 和 {{ 1}} Avoiding in your own package。
免注册 COM:有些人将 registrationless COM 视为旧 VB6 应用程序的选项。这涉及将所有注册表设置保存在清单文件而不是注册表中。实现它似乎并不容易。 Microsoft Docs。
取消注册 COM 文件:为了取消注册 COM 文件:
-
DLL 和 OCX 文件可以使用 regsvr32.exe (troubleshooting) 取消注册:
3)
-
EXE 文件可以通过 /unregserver(如果已实现)取消注册
regsvr32.exe /u File.dll
链接:
- Self-repair entry points(什么可以启动自我修复)。
- InstallShield on self repair