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

问题描述

| 我有一个.NET winform应用程序,需要在安装过程中注册一个本机dll。我的问题是,如何在MSI安装过程中注册dll(regsvr32 ABC.dll)?类似地,我如何在卸载过程中注销dll?     

解决方法

vsdrfCOMSelfReg不是最佳实践。尝试使用vsdrfCOM。这将从DLL中“提取”(或尝试,vdproj有时是POS)来自DLL的COM元数据并将其创作到正确的COM表中。最好是这样,希望对DllRegisterServer的进程外调用将在安装时起作用。 现在,MSI本机知道您的COM资源,它将为您处理安装和卸载。     ,克里斯·画家(Chris Painter)的不错答案,供参考:如何在wix 3.9中正确注册DLL。还有一个以WiX为重点的:向WIX注册COM EXE。 自我注册被认为是有害的 注册COM文件的正确方法是从文件中提取COM注册表信息,并将其添加到MSI中适当的COM表族中。大多数MSI工具具有支持此COM提取的功能,有关详细信息,请参见答案末尾的单独部分。 该MSI SDK文章列出了以下所述的有关自注册的一般问题的几种变体,并描述了一些其他详细信息-尤其是关于按用户注册COM数据和从源运行的方案。 提取的COM数据将确保您的COM服务器的可靠安装,以及对高级MSI功能(如“广告”,“回滚”,弹性和“特权提升”)的支持。您可以在此摘要中了解有关这些高级MSI优势的更多信息,该摘要在serverfault.com上已变得颇为流行:MSI的企业利益。 也可以使用Windows安装程序中的内置SelfReg表在安装过程中使用regsvr32.exe来注册文件(或什至作为自定义操作调用),但是出于多种原因,这被认为是不好的做法: 回滚:除非将COM数据提取并嵌入到MSI中,否则Windows Installer无法正确处理回滚。结果是失败的设置可能无法正确清理其COM占用空间,并且MSI无法将计算机正确地恢复到原始状态。 COM数据的回滚确实像“自动魔术”一样工作,它跟踪注册表中的每个更改(无论是添加,修改还是删除),并且在正确完成后是可靠的。 安全性:在某些情况下,COM服务器的自注册过程可能会执行非常规的任务,例如修改系统的网络设置或执行其他与COM无关,难以识别和调试的疯狂操作。我个人难以置信地看到,COM注册更改了系统范围的网络设置而没有任何警告,并且没有明显的原因。它可能只是对应用程序的优化,但是当它更改整个系统并影响所有其他软件时,这几乎是不可接受的。尽管以admin模式运行的EXE文件可以执行相同的操作,并且同样存在错误,但是自注册可能会受到注意,并且作为安全问题不太明显。这是大型公司和Microsoft最佳实践坚持禁止自我注册的核心原因,因为它可能会干扰关键业务系统。 链接的依存关系:某些COM文件可能需要按特定顺序在系统上注册才能成功注册。换句话说,文件B只有在文件A被注册后才能注册。老实说,我在现实生活中从未见过这种情况,但是从技术上讲这是可能的,而且我已经看到对语言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)(不幸的是,Wise现已退出市场)都为此提供了自动化解决方案。 在Installshield中,您只需启用一个名为\“ Extract COM data on build \”的组件标志,而Wise在组件级别具有类似的标志。 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等     ,在此处向下滚动到Windows Installer的Tao中的规则19,以查看MSI团队说的内容: http://blogs.msdn.com/b/windows_installer_team/archive/2006/05/12/595950.aspx     ,选择要注册的文件,然后在“属性”窗口中将“注册”字段设置为vsdrfCOMSelfReg。这将在SelfReg表中创建一个条目,该条目将自动注册/注销您的DLL。 http://msdn.microsoft.com/zh-CN/library/aa371608(VS.85).aspx     

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...