类未注册错误

30

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

检索CLSID {F2D4F4E5-EEA1-46FF-A83B-A270C92DAE4B} 组件的COM类工厂失败,原因是:80040154 类未注册 (来自HRESULT的异常:0x80040154 (REGDB_E_CLASSNOTREG))

我在Visual Studio中使用了Inventor packandgo dll库。

是否有人知道这个错误是什么意思?

12个回答

59

我的问题和解决方法

  1. 我安装了一个32位的第三方dll在64位的2008 R2机器上。

  2. 我创建了一个使用.net 4.5框架的wcf服务,该服务调用32位的第三方dll进行处理。现在我将构建属性设置为目标“任何”CPU并将其部署到64位机器上。

  3. 当我尝试调用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的解决方法是将正确的应用程序池的“Enable32bitApplications”设置为“True”。


1
@RohitGupta 最后一条看起来是解决方案 :-) - kleopatra
@kleopatra,没错。我已经编辑过了,突出了“solution”这个词。我也删掉了我的评论。但是我无法取消我所举报的标记。我已经点赞了它。 - Rohit Gupta
1
BRIL!不仅是一个解决方案,而且还提供了详细的根本原因描述(至少在我的情况下)。非常感谢。 - Mina Jacob
1
我遇到了这个问题,通过在操作系统Windows 10 64位上将解决方案平台更改为x86,问题得以解决。谢谢!@Waheed - Muzammil Imran
我有一个旧项目,我将其切换到“任何 CPU”,但它应该是 x86。我认为当前的 CC DLL 与 x86 兼容。 - Alper
显示剩余2条评论

17
问题在于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有效。


5

我曾经遇到过同样的问题。尝试了很多方法,但最终的解决方案很简单。解决方法如下:

打开IIS,在应用程序池中,右键点击正在使用的.NET框架。

进入设置并将“启用32位应用程序”改为“True”即可。


5
在您使用的代码中,存在对Win32 API CoCreateInstance 的调用,以动态加载DLL并从中实例化对象。
组件ID与能够实例化该对象的DLL之间的映射通常在注册表的HEKY_CLASSES_ROOT\CLSID中找到。要进一步讨论这个问题,需要解释关于Windows中COM的很多内容。但是错误表明,注册表中不存在COM GUID。
我不太了解PackAndGo DLL(Autodesk组件),但我怀疑您只需要通过指定的安装程序“安装”该组件或它所附带的软件包,就可以在您要运行代码的计算机上拥有该DLL和适当的COM注册表键。(即运行此产品的setup.exe)。
换句话说,我认为您需要在这台计算机上安装“Pack and Go”,而不仅仅是将DLL复制到目标计算机。
此外,请确保根据安装的Pack And Go版本(32位或64位)适当地构建您的代码。

1
我遇到了同样的问题。我添加了Microsoft.Office.Interop.Excel COM组件的dll引用,但我的系统上没有安装Office,因此不会出现编译时错误。我将应用程序移动到另一个系统并运行它...它成功地运行了。
所以,在我的情况下,是系统环境导致了这个问题。

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

我的32位应用程序出现以下错误。

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

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


0

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

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


0
这种情况发生在我为一个工作区启动eclipse而不是其他工作区时。在那个工作区中,我打开了一个带有“JS编辑器”的*.ts文件。尽管在首选项中具有正确的文件关联,但仍出现错误。其他*.ts文件打开时没有错误。为了解决这个问题,在“打开资源”(ctrl-shift-r)中,我使用“打开方式”按钮并选择“JS编辑器”,文件就可以正常打开了。之后,eclipse就知道要使用哪个编辑器来打开该文件。我解决了一个特定文件类型的问题,但解决方案可能适用于所有文件类型。希望这能帮助到某些人。谢谢阅读。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接