在64位计算机上从Visual Studio 2012运行应用程序,显示以下错误消息:
检索具有CLSID {F2D4F4E5-EEA1-46FF-A83B-A270C92DAE4B}的组件的COM类工厂由于以下错误而失败:80040154未注册类(HRESULT异常:0x80040154(REGDB_E_CLASSNOTREG))
我在visualstudio中使用Inventor packandgo dll库。
任何人都知道错误是什么?
答案 0 :(得分:26)
我的问题和解决方案
我有一个32位第三方dll,我在2008 R2机器上安装了64位。
我在.net 4.5框架中创建了一个wcf服务,该服务调用32位第三方dll进程。现在我已经将属性设置为目标'任何' cpu并将其部署到64位计算机上。
当Ii尝试调用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:无法加载文件或程序集"
解决方案是设置' Enable32bitApplications'到了真的'在适用于右侧apppool的IIS Apppool属性中。
答案 1 :(得分: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为我工作
答案 2 :(得分: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位)。
答案 3 :(得分: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位)。
答案 4 :(得分:1)
长期解决了我确定但这可能会帮助其他一些可怜的灵魂。
如果您在安装包中部署的DLL与您引用的DLL不同(这些将具有不同的ID),则此错误可能会失效
听起来很明显但是如果你对dll进行了一些小改动并且之前已经在自己的机器上安装了应用程序并重新注册了dll,则很容易发生。
答案 5 :(得分:0)
我遇到了这个问题,当我理解它正在寻找括号中指定的Windows注册表时,我解决了这个问题。
由于错误只发生在一台计算机上,我所要做的就是从它正在运行的计算机中导出注册表,并将其安装在缺少它的计算机上。
答案 6 :(得分:0)
我的32位应用程序出现以下错误。
错误:使用CLSID检索组件的COM类工厂 {4911BB26-11EE-4182-B66C-64DF2FA6502D}由于以下原因而失败 错误:80040154未注册类(HRESULT的异常: 0x80040154(REGDB_E_CLASSNOTREG)。
然后在IIS的Enable32bitApplications
中将“ defaultapplicationpool
”设置为true对我有用。
答案 7 :(得分:0)
我有同样的问题。我尝试了很多方法,但最后解决方案很简单。 解: 打开IIS,在“应用程序池”中,右键单击正在使用的.net框架。 转到设置,然后将“启用32位应用程序”更改为“真”。
答案 8 :(得分:0)
我遇到了同样的问题。我添加了Microsoft.Office.Interop.Excel COM组件的dll的引用,但未在我的系统上安装Office,它不会给出编译时错误。我将我的应用程序移至另一个系统并运行它。.它成功运行。
因此,我可以说是引起此问题的是系统环境。
答案 9 :(得分:0)
对我来说,我必须安装Microsoft Access Database Engine 2010 Redistributable并重新启动计算机。