当我尝试创建COM类的实例时,它将引发异常
未注册类(HRESULT的异常:0x80040154(REGDB_E_CLASSNOTREG))
请提出我该如何解决?
当我尝试创建COM类的实例时,它将引发异常
未注册类(HRESULT的异常:0x80040154(REGDB_E_CLASSNOTREG))
请提出我该如何解决?
Answers:
似乎您尝试初始化的程序或进程中的任何一个均未安装在计算机上,安装已损坏或需要注册。
安装,修复(通过“添加/删除程序”)或注册(通过Regsvr32.exe)。
您没有为我们提供足够的信息来帮助您。
您需要确保所有程序集都针对正确的体系结构进行编译。如果无法重新安装COM组件,请尝试更改x86的体系结构。
我的问题和解决方案
我有一个32位第三方dll,它已在64位的2008 R2计算机中安装。
我在.net 4.5框架中创建了一个wcf服务,该服务调用32位第三方dll进行处理。现在,我将build属性设置为以“ any” cpu为目标,并将其部署到64位计算机上。
当我尝试调用wcf服务时收到错误“ 80040154类未注册(HRESULT的异常:0x80040154(REGDB_E_CLASSNOTREG“
现在,我使用ProcMon.exe来跟踪com注册表问题,并确定该进程正在HKLM \ CLSID和HKCR \ CLSID处查找没有条目的注册表项。
知道Microsoft不会将32位com组件注册到64位计算机中的路径HKLM \ CLSID,HKCR \ CLSID,而是将条目放置在HKLM \ Wow6432Node \ CLSID和HKCR \ Wow6432Node \ CLSID路径中。
现在,冲突是64位进程尝试在64位计算机中调用32位进程,该进程将在HKLM \ CLSID,HKCR \ CLSID中查找注册表项。解决方案是我们必须强制64位进程查看HKLM \ Wow6432Node \ CLSID和HKCR \ Wow6432Node \ CLSID的注册表项。
这可以通过将wcf服务项目属性配置为以“ X86”计算机而非“任何”计算机为目标来实现。
在将“ X86”版本部署到2008 R2服务器后,出现问题“ System.BadImageFormatException:无法加载文件或程序集”
解决此badimageformatexception的方法是,在正确的apppool的IIS Apppool属性中将“ Enable32bitApplications”设置为“ True”。
还要注意,初始化时的类上下文可以创建该异常。如果您有一个编码为INPROC_SERVER的对象,但是尝试将CoCreateInstance编码为CLSCTX_LOCAL_SERVER,则也会出现该错误。
您需要确保该对象已注册,并且CoCreateInstance正在使用正确的类上下文创建实例。
DesktopWallpaper使用CLSCTX_INPROC(而不是CLSCTX_ALL)进行创建,则会收到0x80040154 (REGDB_E_CLASSNOTREG)错误消息。
我通过在“应用程序池”高级设置中启用32位应用程序来使其工作。右键单击应用程序池,然后选择高级设置-启用32位应用程序。这可能会帮助某人。
我遇到了一个问题,即通过COM从C ++客户端调用.Net程序集。事实证明,找不到.Net程序集所依赖的程序集之一。我挣扎了一段时间,试图找出第一个程序集出了什么问题,但这实际上是第一个程序集的依赖项之一。从C ++客户端调用CoCreateInstance()时,我收到两个不同的错误。第一个是: REGDB_E_CLASSNOTREG未注册的类 ,第二个尝试是: 0x80131040:找到的程序集的清单定义与程序集引用不匹配。
因此,请检查程序集的引用是否存在。我通过使用dotPeek浏览第一个程序集并注意到其中的一个引用丢失了这一点。将正确版本的依赖项放在文件夹中可以解决这两个错误。
我在运行时使用COM类遇到了相同的问题,即“类未注册的异常”。对我而言,我能够通过转到app.config文件来解决并将“ startup”和“ supportedRuntime”元素更改为类似以下内容:
<configuration>
<startup useLegacyV2RuntimeActivationPolicy="true">
<supportedRuntime version="v4.0"/>
</startup>
</configuration>
您可以在此处阅读有关详细信息的更多信息http://stackoverflow.com/questions/1604663/
和这里https://msdn.microsoft.com/en-us/library/w4atty68(v=vs.110).aspx
我应该注意我正在运行Visual Studio2017。目标cpu = x86 Embed Interop Type = true(在属性窗口中)
我也遇到过同样的问题。经过一些研究后,我找到了解决方案,它可能有用。根据我的观察,这个问题不仅与重新安装有关,还取决于访问权限。
步骤1:修复特定的COM对象。
步骤2:组件服务>计算机>我的电脑> DCOM Config>选择您的COM对象>右键单击>属性>安全性选项卡>访问权限>选择自定义>单击EDIT>选择IIS_USER(如果不存在,请创建具有完整权限的文件)并提供完整权限访问并单击确定。
移至“身份”选项卡>您可以选择“交互式用户”或“此用户”>单击应用,然后单击确定。如果您选择“此用户”,我们必须将该服务器授予“管理”特权用户
步骤3:打开IIS管理器>重新启动应用程序池。
注意:如果需要,请重新启动服务器