类未注册错误

问题描述 投票:11回答:9

在64位计算机上从Visual Studio 2012运行应用程序,显示以下错误消息:

检索具有CLSID {F2D4F4E5-EEA1-46FF-A83B-A270C92DAE4B}的组件的COM类工厂由于以下错误而失败:80040154未注册类(HRESULT异常:0x80040154(REGDB_E_CLASSNOTREG))

我正在使用Inventor pack并在visual studio中使用dll库。

任何人都知道错误是什么?

dll visual-studio-2012 com 64bit 32-bit
9个回答
28
投票

我的问题和解决方案

  1. 我有一个32位的第三方DLL,我已经在2008 R2机器上安装了64位。
  2. 我有一个在.net 4.5框架中创建的wcf服务,它调用32位第三方dll进程。现在我已经构建了属性集来定位'任何'cpu并将其部署到64位机器。
  3. 当Ii尝试调用wcf服务时出现错误“80040154类未注册(HRESULT异常:0x80040154(REGDB_E_CLASSNOTREG”)
  4. 现在,我使用ProcMon.exe来跟踪com注册表问题,并确定该进程正在HKLM \ CLSID和HKCR \ CLSID中查找没有条目的注册表项。
  5. 了解到Microsoft不会将32位com组件注册到64位计算机中的路径HKLM \ CLSID,HKCR \ CLSID,而是将条目放在HKLM \ Wow6432Node \ CLSID和HKCR \ Wow6432Node \ CLSID路径中。
  6. 现在冲突是64位进程试图在64位机器中调用32位进程,它将在HKLM \ CLSID,HKCR \ CLSID中查找注册表项。解决方案是我们必须强制64位进程查看HKLM \ Wow6432Node \ CLSID和HKCR \ Wow6432Node \ CLSID的注册表项。
  7. 这可以通过将wcf服务项目属性配置为“X86”计算机而不是“任何”来实现。
  8. 将“X86”版本部署到2008 R2服务器后出现问题“System.BadImageFormatException:无法加载文件或程序集”
  9. 这个badimageformatexception的解决方案是在右侧apppool的IIS Apppool属性中将“Enable32bitApplications”设置为“True”。

5
投票

问题是DLL在32位版本的Windows注册表上注册,并且应用程序使用的是64位版本。

解决方案:进入“项目属性”,“编译”选项卡,然后单击“高级编译选项...”。将“目标CPU”更改为x86,单击“确定”,保存并重试。

资料来源:http://www.theogray.com/blog/2009/10/comexception-regdbeclassnotreg-on-64-bit-windows

使用从.Net 4 Winforms应用程序调用的VB 6 COM DLL为我工作


4
投票

在您使用的代码中的某个地方,调用Win32 API(CoCreateInstance)来动态加载DLL并从中实例化对象。

组件ID和能够实例化该对象的DLL之间的映射通常位于注册表中的HEKY_CLASSES_ROOT \ CLSID中。进一步讨论这将解释很多关于COM in Windows。但该错误表明注册表中不存在COM guid。

我对PackAndGo DLL是什么(Autodesk组件)并不多,但我怀疑你只需要通过指定的安装程序“安装”该组件或其附带的软件包,以获得该DLL和相应的COM注册表项您正在尝试运行代码的计算机。 (即运行此产品的setup.exe)。

换句话说,我认为您需要在此计算机上安装“Pack and Go”,而不是仅将DLL复制到目标计算机。

此外,请确保您决定构建适合32位与64位的代码,具体取决于您安装的Pack And Go的构建风格(32或64位)。


1
投票

在64位Windows机器中,COM组件需要在HKEY_CLASSES_ROOT \ CLSID(64位组件)或HKEY_CLASSES_ROOT \ Wow6432Node \ CLSID(32位组件)中注册自身。如果您的应用程序是在64位计算机上运行的32位应用程序,则COM库通常会在Wow64节点下查找GUID,如果您的应用程序是64位应用程序,则COM库将尝试从HKEY_CLASSES_ROOT \ CLSID加载。确保您的目标是正确的平台,并确保已安装正确版本的库(32/64位)。


1
投票

很久以来我很确定,但这可能有助于其他一些可怜的灵魂。

如果您在安装包中部署的DLL与您引用的DLL不同(这些将具有不同的ID),则此错误可能会失效

听起来很明显但是如果你对dll进行了一些小改动并且之前已经在自己的机器上安装了应用程序来重新注册dll,则很容易发生。


0
投票

我有这个问题,当我明白它正在寻找括号中指定的Windows注册表时,我解决了它。

由于错误只发生在一台计算机上,我所要做的就是从它正在运行的计算机中导出注册表,并将其安装在缺少它的计算机上。


0
投票

我在32位应用程序中遇到以下错误。

错误:由于以下错误,检索具有CLSID {4911BB26-11EE-4182-B66C-64DF2FA6502D}的组件的COM类工厂失败:80040154未注册类(HRESULT异常:0x80040154(REGDB_E_CLASSNOTREG))。

在IIS中的Enable32bitApplications中将“defaultapplicationpool”设置为true对我有用。


0
投票

我有同样的问题。我尝试了很多方法,但最后解决方案很简单。解决方案:打开IIS,在“应用程序池”中,右键单击正在使用的.net框架。转到设置并将“启用32位应用程序”更改为“True”。


0
投票

我遇到了同样的问题。我添加了Microsoft.Office.Interop.Excel COM组件的dll的引用,但我的系统上没有安装Office它不会给编译时错误。我将我的应用程序移动到另一个系统并运行它..它成功运行。

所以,我可以说,在我的情况下,系统环境导致了这个问题。

© www.soinside.com 2019 - 2024. All rights reserved.