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

如何解决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     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 <select id="xxx"> SELECT di.id, di.name, di.work_type, di.updated... <where> <if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 <property name="dynamic.classpath" value="tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-