MSI注册dll - 自我注册被认为是有害的

Sil*_*ent 5 installer windows-installer wix dllregistration winforms

我有一个.NET winform应用程序,需要在安装过程中注册本机DLL.我的问题是如何在MSI安装过程中注册一个DLL(regsvr32 ABC.dll)?类似如何取消注册dll作为卸载过程的一部分?

Ste*_*mul 12

自我注册被认为是有害的

注册COM文件的正确方法是从文件中提取COM注册表信息,并添加到MSI中相应的COM表系列.大多数MSI工具都具有支持此COM提取的功能,有关详细信息,请参阅答案末尾的单独部分.

此MSI SDK文章列出了下面描述的自注册一般问题的几种变体,并描述了一些进一步的细节 - 特别是关于COM数据的每用户注册和源代码源方案.

提取的COM数据将确保COM服务器的可靠安装,并支持高级MSI功能,如" 广告 "," 回滚 ",弹性和" 提升权限 ".您可以在本摘要中阅读有关这些高级MSI优势的更多信息,这些优点在serverfault.com上已经有些受欢迎:MSI的企业优势.

也可以使用Windows安装程序中的内置SelfReg表来使用regsvr32.exe作为安装过程的一部分注册文件(甚至作为自定义操作调用),但由于多种原因,这被认为是不好的做法:

  • 回滚:Windows Installer无法正确处理回滚,除非提取COM数据并将其嵌入MSI中.结果是失败的设置可能无法正确清理其COM占用空间,并且MSI不会使机器正常恢复到原始状态.COM数据的回滚确实像"自动魔术"一样跟踪注册表中的每个更改,无论是添加,修改还是删除,并且在完成时是可靠的.
  • 安全性:COM服务器的自注册过程在某些情况下可能会执行非正统的任务,例如修改系统的网络设置或执行与COM无关且难以识别和调试的其他疯狂操作.我个人看到,我不相信,我可能会添加,COM注册更改系统范围的网络设置,没有任何警告,并没有明显的原因.它可能只是应用程序的优化,但当它改变影响所有其他软件的整个系统时,这很难被接受.虽然以管理员模式运行的EXE文件可以做同样的事情并且同样有问题,但是自我注册可能会受到关注并且作为安全问题不那么明显.这是大公司和Microsoft最佳实践坚持不允许自行注册的核心原因,因为它可能会干扰业务关键系统.
  • 链接依赖项:某些COM文件可能需要在系统上以特定顺序注册才能成功注册.换句话说,在文件A注册之前,文件B无法注册.我老实说从来没有在现实生活中见过这个,但它在技术上是可行的,而且我已经看到对语言dll(仅资源dll)的依赖导致COM提取失败.虽然略有不同,但它仍然是一个依赖性问题.MSI不允许指定注册顺序(可能是由于MSI的数据库来源,行是无序的).如果在构建计算机上正确提取注册表数据并将其放入MSI,则这些链接的依赖项不会导致应用程序错误.
  • 权限问题:Windows Installer具有高级功能,可以提升安装MSI的用户的权限级别,以允许在没有权限问题的情况下注册所有信息(不会弄乱临时管理权限).如果您使用SelfReg表,则更有可能遇到由本地系统的权限或特权特性引起的注册问题(根据我的经验,这对于自我修复操作尤其明显).随着Windows的新版本不断为软件的成功部署(UAC提示,自我修复锁定,模拟更改等)设置新的障碍,这些许可问题越来越多.
  • 恢复能力:如果另一个应用程序销毁您的COM注册表项,如果使用适当的COM提取来生成包,则MSI中嵌入的COM数据将通过自我修复重新安装COM组件及所有相关的注册表项.这意味着您的应用程序应始终能够在其COM服务器正确注册的情况下启动.然而,这也可能触发许多有经验的计算机用户所看到的可怕的自修复周期重复序列(这里是一个更简单和更简短的解释).换句话说,COM提取也可能存在问题,但仅使用自行注册会使应用程序损坏,如果您对产品进行修复,修改或自我修复,也会触发安全错误(自我注册)操作可以在没有提升权限的情况下运行,因此如果修复作为受限用户运行则无法完成.这意味着大多数普通用户无法修复错误.如果产品不能正常工作,他们就知道如何做.
  • 广告:广告产品可通过快捷方式和注册表项提供给用户,但目前尚未安装在计算机上.可以通过几种方式调用"按需"安装 - 称为广告入口点(推荐的Symantec文章),其中之一是广告COM服务器的调用.除非文件在注册表中正确公布,否则不会触发安装,因此如果您使用自行注册,则会丢失"自修复"的关键触发器.

COM注册的安装工具支持

提取COM数据和进入MSI表是一个相当复杂的任务,市场上的大多数工具,如Installshield,Advanced Installer明智的 (不幸的是,Wise现已离市)有自动解决方案.

Installshield中,您只需启用一个名为" 在构建时提取COM数据 "的组件标志,并且明智的在组件级别上有一个类似的标志.WiX可以使用名为heat.exe的工具提取COM注册表数据,并且生成的WiX代码可以插入到您的源WiX文件中(现在可能还有新的功能,我不知道).我不知道Visual Studio中会自动提取COM数据的任何功能,但看起来Chris Painter在他的回答中提供了一种可能性.

如果Heat不适合您,请查看RegSpy2(Phil Wilson - "Windows安装程序权威指南"的作者写了RegSpy,有人将其扩展到RegSpy2).还要检查一下:使用WiX注册ActiveX exe服务器(我的回答是针对regspy.exe命令行使用的底部).

插入到MSI中的错误COM数据 - 特别是对于企业环境中的重新打包应用程序 - 是" 意外的周期性自我修复 "的主要原因之一.请参阅这篇长篇文章以解释此问题:如何确定导致重复Windows Installer自修复的原因?(第3节"一些典型的自修复问题场景"一节中描述了这个问题).

其他几种安装工具具有类似的提取功能:使用什么安装产品?InstallShield,WiX,Wise,Advanced Installer等


Chr*_*ter 4

vsdrfCOMSelfReg 不是最佳实践。请尝试使用 vsdrfCOM。这将从 DLL 中“提取”(或尝试,vdproj 有时是 POS)COM 元数据并将其编写到正确的 COM 表中。这比希望在安装时对 DllRegisterServer 的进程外调用有效要好。

现在 MSI 本身就知道您的 COM 资源,它将为您处理安装和卸载。