如何解决COMexception类未注册(exception来自HRESULT:0x80040154(REGDB_E_CLASSNOTREG))?

当我尝试创build一个COM类的实例时,会引发一个exception

未注册的类(从HRESULTexception:0x80040154(REGDB_E_CLASSNOTREG))

请build议我怎么解决它?

它看起来像是你试图初始化的程序或进程中的任何一个没有安装在你的机器上,有一个损坏的安装或需要注册。

安装它,修复它(通过添加/删除程序)或注册它(通过Regsvr32.exe)。

您还没有提供足够的信息来帮助我们。

您需要确保所有程序集都正在编译正确的体系结构。 尝试更改x86的体系结构,如果重新安装COM组件不起作用。

另外请注意,初始化时的类上下文可以创build该exception。 如果您有一个编码为INPROC_SERVER的对象,但您尝试将CoCreateInstance作为CLSCTX_LOCAL_SERVER,那么您也将得到该错误。

您需要确保对象已注册,且CoCreateInstance正在使用正确的类上下文创build实例。

如果在IIS上的Web应用程序中使用64位COM组件,请确保应用程序池设置为不允许32位应用程序(在高级设置中启用32位应用程序:false

我的问题和解决scheme

我有一个32位的第三方DLL,我已经安装在64位的2008 R2机器。

我在.net 4.5框架中创build了一个wcf服务,它调用32位的第三方dll进程。 现在我已经build立属性设置为“任何”CPU目标,并将其部署到64位机器。

当我试图调用wcf服务得到错误“80040154类未注册(exception从HRESULT:0x80040154(REGDB_E_CLASSNOTREG”

现在,我使用ProcMon.exe来跟踪comregistry问题,并确定该进程正在查找HKLM \ CLSID和HKCR \ CLSID没有条目的registry项。

了解到微软不会将32位com组件注册到64位机器中的pathHKLM \ CLSID,HKCR \ CLSID,而是将条目放在HKLM \ Wow6432Node \ CLSID和HKCR \ Wow6432Node \ CLSIDpath中。

现在冲突是64位进程尝试调用64位机器中的32位进程,它将在HKLM \ CLSID,HKCR \ CLSID中查找registry项。 解决scheme是我们必须强制64位进程查看HKLM \ Wow6432Node \ CLSID和HKCR \ Wow6432Node \ CLSIDregistry项。

这可以通过configurationwcf服务项目属性来定位到“X86”机器而不是“任何”来实现。

将“X86”版本部署到2008 R2服务器后出现问题“System.BadImageFormatException:无法加载文件或程序集”

对于这种badimageformatexception的解决scheme是在正确的apppool的IIS Apppool属性中将“Enable32bitApplications”设置为“True”。

通过注册类(特别是它的CLSID) – 见例如这里 。

我通过在应用程序池高级设置中启用32位应用程序来实现它。 右键单击应用程序池并select高级设置 – 启用32位应用程序。 这可能会帮助那里的人。

我解决这个问题的方法是通过regsvr32注册COM

确保您正在调用的COM已注册。

我的应用程序使用xceedcry.dll ,我没有注册它。 一旦我注册,应用程序工作正常。

对我来说,我不得不创build64位构buildconfiguration。

在我的情况

my platform是x64

the Dll library(sdk)和可redistributable package是x64

所以

  1. 在解决scheme浏览器中navigate to your project

  2. 打开Properties

  3. change the Platform target from AnyCPU to x64

在这里输入图像描述

我遇到了这个问题,通过COM从C ++客户端调用.Net程序集。 事实certificate,.Net程序集所依赖的程序集之一无法find。 我摔跤了一会儿,试图找出第一个程序集有什么问题,但实际上它是第一个程序集的依赖项之一。 从C ++客户端调用CoCreateInstance()时收到两个不同的错误。 第一个是: REGDB_E_CLASSNOTREG类未注册第二次尝试是: 0x80131040:find的程序集的清单定义与程序集引用不匹配。

所以检查你的程序集的引用是否存在。 我通过使用dotPeek浏览第一个程序集发现了这一点,并注意到它的一个引用丢失了。 在文件夹中放置正确版本的依赖关系解决了这两个错误。

我正在编译我的应用程序,针对任何CPU和主要问题,事实certificate,安装旧的V10.x的 Adobe Reader需要升级 V11.x ,这是我如何解决这个问题。

我的解决scheme是在IIS的相关应用程序池的高级设置中将“ 启用32位应用程序 ”更改为True。

应用程序池

启用32位应用程序

我遇到了同样的问题,使用COM类,即在运行时的“类未注册的exception”。 对于我来说,我可以通过转到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 Studio 2017. Target cpu = x86 Embed Interop Type = true(在属性窗口中)

在我的情况下,这个类被正确注册,并以任何CPU / 64位模式构build。

但是使用该类的应用程序的IIS应用程序池的“ 启用32位应用程序”属性已设置为True

没有find类,因为应用程序池configuration和实际注册的类之间的架构不匹配。

将“ 启用32位应用程序”设置为False可解决问题。 IIS应用程序池设置

这里find解决办法,运行mmc -32工具(不是dcomcfg)

在32位Office的64位系统上试试这个:

 Start Run mmc -32 File Add Remove Snap-in Component Services Add OK Console Root Component Services Computers My Computer DCOM Config Microsoft Excel Application 

在这里输入图像描述