MSI安装程序使用Com-interop进行更新

本文关键字:更新 Com-interop 安装 程序 MSI | 更新日期: 2023-09-27 18:28:40

我几周前创建了一个安装程序(基本的windows安装程序类型)(版本1.0.0),它部署了一些dll,还为com interop注册了其中一个dll(使用vdsrpCOM)。其实没什么大不了的。我还有一个助手类,它通过自定义操作(在特定位置提取ZIP库)在BeforeInstall和onAfterInstall上做一些事情。

现在是时候更新我的产品了,更具体地说,我的com注册dll。因此,我更改了所有dll的文件和程序集版本,这些dll必须升级并将安装程序标记为RemovePreviousVersions=true。当然,除了更新我项目的文件和程序集版本外,我还更新了安装程序的版本(到1.1.1)

当安装这个新版本时,每个有新文件版本的dll都会被很好地覆盖,而那些没有更改文件版本的则不会(当然,MSI很聪明,"如果东西没有更改,我为什么要替换它?"…)

我现在遇到的唯一错误是我的com注册dll注册得不太好了。我还注意到,在ole视图中,我的dll仍然是注册的,但在"注册表部分"中缺少一些代码行,更具体地说:MyNamespace.MyClass=MyNamespace.MyClassCLSID={bla-bla bla-bla}

卸载和重新安装解决了这个问题。但当然,我不想卸载和重新安装,因为这是MSI应该注意的。

所以,我一直在想,因为我确实有一个installerHelper,它在onBeforeInstall上通过自定义操作触发,为什么我不检查自己是否安装了版本,如果安装了,就删除它。

现在,UpgradeCode中版本之间的唯一常量。我的问题从这里开始:如何从助手类中获取升级代码,检查是否有相同升级代码的以前版本,在onBeforeInstall方法中卸载这些版本?

或者,也许更好的是,我如何确保com注册在更新时得到很好的处理?(这可能更容易,但我确实喜欢这个想法,能够强制进行完整的卸载/重新安装)

MSI安装程序使用Com-interop进行更新

这是一个例子,说明了在windows安装程序世界中,任何形式的"自注册"都不是最佳实践。当您使用内置的Windows Installer功能时,它通常只起作用,并且您可以获得正确的事务行为(安装、卸载、回滚、提交)。当你脱离流程并使用"助手"时,如果你不确切地知道(我指的是)你在做什么,它会很快变得丑陋。

我不清楚您的COM服务器是本机服务器还是托管服务器。也不清楚你用什么工具来编写MSI。确切的答案将取决于这两个因素。

但一般来说,这个概念是从DLL中"获取"或"提取"COM元数据,并使用COM表(ProdID、Class等表)将其直接写入MSI,或者避免注册表表中的某些COM广告。像InstallShield这样的工具可以让这变得更容易(右键单击|COM Extract或COM Extract at Build=True或.NET COM Interop=True),但也有一些方法可以使用工具获取这些信息,然后手动将其导入到安装程序项目或代码中。

这样做的好处是MSI完全了解DLL的资源,并且可以为您管理所有资源。这提高了安装程序的性能和可靠性。