检索CLSID {XXXX}组件的COM类工厂失败,原因是以下错误:80040154

我用c#开发了一个Windows服务。生成PDF报告。要生成PDF文件,我使用第三方dll。应用程序在我的Windows XP平台上运行。当我在Windows Server 2008 64位版本中部署服务时,我得到了这个错误:

检索COM类工厂 带有CLSID的组件 {46521 b1f - 0 a5b - 4871 - a4c2 fd5c9276f4c6} 由于以下错误导致失败: 80040154 . < / p >

我使用regsvr32命令注册了DLL。我能够在注册表中看到这个CLSID。但问题依然存在。

有什么问题吗?

581018 次浏览

听起来你的服务是针对“任何CPU”构建的,导致你在使用COM组件的64位上出现错误。你需要为x86构建它。

该网站可能作为一个32位进程运行,这就是为什么它可以使用该组件。基于x86构建您的解决方案将强制您的服务以32位运行。

问题是服务器进程是64位的,而库是32位的,它试图在同一个进程(进程内服务器)中创建COM组件。要么重新编译服务器,使其成为32位,要么保持服务器不变,使COM组件处于进程外。使COM服务器脱离进程最简单的方法是创建一个COM+应用程序-控制面板->管理工具->组件服务。

在VS -项目属性-在Build选项卡-平台目标=X86

我也遇到过类似的问题。

我需要在64位机器上开发的Web应用程序中使用旧的32位DLL。我将32位DLL注册到windows\sysWOW64文件夹中,使用该文件夹中的regsvr32版本。

对第三方DLL的调用在Visual Studio中的单元测试中正常工作,但在同一台机器上的IIS中托管的Web应用程序中失败,并出现80040154错误。

将应用程序池更改为“启用32位应用程序”;解决问题。

要更改为x86:

  1. 为您的解决方案创建一个安装项目。
  2. 创建后,转到解决方案资源管理器,右键单击安装项目。
    • 按“配置管理器”。
    • 点击:“Active Solution Platform”组合框,选择新建(如果没有显示x86)
    • 从第一个组合x86中选择,然后按OK。
    • 重建安装项目,然后重建所有项目。
    • 李< / ul > < / >

windows 2008服务器x64的解决方案是:

  1. 以管理员权限打开cmd.exe。
  2. 将dll拷贝到C:\Windows\SysWOW64文件夹
  3. 从C:\Windows\SysWOW64运行regsvr32
  4. 验证dll在Windows注册表中。
  5. 如果你有一个使用dll的。exe x86, exe必须在x86模式下编译。
  6. exe必须安装在C:\Program Files (x86)文件夹中。

这个程序是有效的,是可以的

如果您正在运行一个网站,您还可以尝试将应用程序池设置为禁用32位应用程序(在池的高级设置下)。

有一个相关的问题,但不同,但类似的修复:

我使用64位DLL将Windows服务项目设置为“Any-CPU”。同样的错误信息。我试过很多方法,但都没用。最后,我进入项目属性-> Build,注意到项目选中了“首选32位”。不选中此选项,就不会出现更多错误。

我的猜测是windows服务期望一个32位DLL,但找不到它。

如果你正在寻找一种不需要重新编译任何CPU应用程序的方法,这里有另一种潜在的解决方案:

  1. 将COM对象GUID定位到HKey_Classes_Root\Wow6432Node\CLSID\{GUID}
  2. 一旦找到,添加一个新的REG_SZ (string) Value。Name应该是AppID, data应该是刚才搜索的COM对象GUID
  3. 在HKey_Classes_Root\Wow6432Node\AppID下添加一个新密钥。新键的名称应该与COM对象GUID相同。
  4. 在刚刚添加的新键下,添加一个新的String Value,并将其称为DllSurrogate。将值保留为空。
  5. 在HKey_Local_Machine\Software\Classes\AppID\下创建一个新的密钥 同样,新键的名称应该与COM对象的GUID相同。 .在此键下不需要添加任何值

这个解决方案不是我的功劳,但它对我们很有效。查看源代码链接获取更多信息和其他评论。

来源:https://techtalk.gfi.com/32bit-object-64bit-environment/

你不需要配置你的项目属性平台目标X86。 您还可以配置iis选项以使用x86,如

  • 选择应用程序池
  • 选择应用程序使用的池
  • 高级设置
  • 启用32位应用真正的

我遇到了同样的问题,但其他答案只提供了解决方案的一部分。

解决方案有两个方面:

从寄存器中删除64位。

  • c:\windows\system32\regsvr32.exe /U <
  • 这将不会删除对其他文件夹中复制的dll的引用。

  • 找到名为HKEY_CLASSES_ROOT\CLSID{......}\InprocServer32的密钥。该键将DLL的文件名作为其默认值。
  • 我删除了HKEY_CLASSES_ROOT\CLSID{......}文件夹。

将其注册为32位:

  • C:\Windows\SysWOW64\regsvr32 <file.dll>

将其注册为32位而不删除64位注册并不能解决我的问题。

我没有更改任何编译设置。

只需在AppPool高级设置中设置“启用32位应用程序= True”。

这对我很有效

对于任何使用VSTO的人来说,我的问题是缺少对office程序集的引用。如果您试图手动实例化某些VSTO对象,也会出现这种情况。

我的问题是,我有错误的MS同步框架版本(1.0)在我的项目参考。更新到2.1版本后,错误消失了,生活又好了。

在我个人的情况下,这个问题是固定的搜索类id在Windows的注册表上的开发机器(因为这个问题是抛出在客户端PC)。此操作将被放置到导致问题的COM组件中:用于安装程序或更新程序应用程序的在我的.NET项目中引用的x86库没有注册为OCX/COM

问候

我发现我的问题与DLL的实际注册有关。

  • 第一次运行“Regedit.exe"从CMD提示符(我把它的安全级别提高到管理员,“以防万一”)
  • 然后搜索注册表(通过点击“编辑/查找”;在RegEdit菜单中或按Ctrl+F),以查看您收到的关于COM类工厂的错误消息中显示的CLSID。我的CLSID是29AB7A12-B531-450E-8F7A-EA94C2F3C05F。
  • 当找到这个键时,选择子键“inprocserver2”;在Hive节点下,在右边的Regedit帧中确定问题DLL的文件名。显示在“违约”下。
  • 如果该文件位于&;C:\Windows\SysWow64&;(例如C:\Windows\SysWow64\ redemption .dll&;)那么使用&;C:\Windows\SysWow64\RegSvr32.exe"C:\Windows\System32\RegSvr32.exe"文件。
  • 所以我运行一个CMD提示符(在管理级别控制下(只是以防这个级别是需要的),并在命令行上输入(在我的DLL中): C:\Windows\SysWow64\RegSvr32.exe C:\Windows\SysWow64\ Redemption.dll按enter键。
  • 关闭命令窗口(通过“退出”;然后重新启动你的电脑(总是使用重启而不是关闭然后启动,因为(奇怪的是)重新启动执行彻底关闭和重新加载所有的东西,而“;关闭"和Power-Up重新加载存储的驱动程序和其他值的缓存(这可能是错误的)。
  • 将来当您注册DLL时,请记得使用SysWow64 "RegSvr32.exe"对于存储在c:\ windows \ syswow64文件夹中的任何DLL,这个问题c(如果它是由不正确的注册引起的)不应该再次发生。

在我的情况下,我正在生成ms office文件,如wordexcel,我运行Win+R并执行dcomcnfg,在DCOM配置中,除了选择office相关的名称项(如名称包含ExcelWordOffice)和Open the properties, select Identity tab and select the interactive user.作为这个答案

我的错误消息显示CLSID {000209FF-0000-0000-C000-000000000046},所以我必须尝试在DCOM配置中找到这个特定的CLSID,它确实存在,我选择它并遵循相同的步骤设置interactive user,然后它就工作了。

接受的答案,改变目标平台到x86没有工作在可能的情况下!

当我有为visual studio安装了crystal report和crystal report运行时引擎(64位)在我的情况!

还有一些人认为,这个问题可以通过安装32位和64位运行时引擎来解决!

你可以试试!

enter image description here