29

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

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

我在visualstudio 中使用Inventor packandgo dll 库。

有谁知道错误是什么?

4

11 回答 11

50

我的问题和解决方案

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

  2. 我在 .net 4.5 框架中创建了一个 wcf 服务,它调用 32 位第三方 dll 进行进程。现在我已经将构建属性设置为针对“任何”cpu 并将其部署到 64 位机器。

  3. 当我尝试调用 wcf 服务时出现错误“80040154 类未注册(HRESULT 异常:0x80040154(REGDB_E_CLASSNOTREG”

  4. 现在 Ii 使用 ProcMon.exe 跟踪 com 注册表问题,并确定该进程正在查找 HKLM\CLSID 和 HKCR\CLSID 处的注册表项,其中没有条目。

  5. 得知微软不会将 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”机器而不是“Any”来实现。

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

  9. 此 badimageformatexception 的解决方案是在正确的应用程序池的 IIS 应用程序池属性中将“Enable32bitApplications”设置为“真”。

于 2015-09-08T14:42:09.680 回答
14

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

解决方案:进入项目属性,编译选项卡,然后单击“高级编译选项...”。将“Target CPU”改为x86,点击OK,保存再试一次。

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

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

于 2014-01-27T20:30:16.760 回答
5

在您使用的代码中的某处,调用了 Win32 API CoCreateInstance以动态加载 DLL 并从中实例化一个对象。

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

我不太了解 PackAndGo DLL 是什么(一个 Autodesk 组件),但我怀疑您只需要通过指定的安装程序“安装”该组件或它附带的软件包即可拥有该 DLL 和适当的 COM 注册表项您尝试在其上运行代码的计算机。(即运行此产品的 setup.exe)。

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

此外,请确保您决定将代码构建为 32 位还是 64 位,具体取决于您安装的 Pack And Go 的构建风格(32 位还是 64 位)。

于 2013-08-01T05:21:45.837 回答
3

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

于 2019-04-04T10:30:38.450 回答
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 位)。

于 2013-08-02T21:37:36.520 回答
1

我敢肯定,早就解决了,但这可能会帮助其他一些可怜的灵魂。

如果您在安装包中部署的 DLL 与您引用的 DLL 不同(它们将具有不同的 ID),则会发生此错误

听起来很明显,但如果您对 dll 进行小幅更改并且之前在您自己的机器上安装了重新注册 dll 的应用程序,则很容易发生这种情况。

于 2017-10-11T15:03:34.920 回答
1

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

所以,我可以说是系统环境导致了这个问题。

于 2019-05-09T16:20:42.833 回答
0

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

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

于 2014-09-11T18:04:21.220 回答
0

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

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

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

于 2018-11-22T13:53:09.023 回答
0

对我来说,我必须安装 Microsoft Access Database Engine 2010 Redistributable 并重新启动计算机。

于 2019-11-15T21:45:56.290 回答
0

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

于 2022-01-27T19:48:43.543 回答