由于以下错误,检索具有CLSID {XXXX}的组件的COM类工厂失败:80040154

gop*_*pal 272 .net windows-services com-interop 32bit-64bit

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

由于以下错误,检索具有CLSID {46521B1F-0A5B-4871-A4C2-FD5C9276F4C6}的组件的COM类工厂失败:80040154.

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

可能是什么问题呢?

小智 375

在VS - 项目属性中 - 在Build选项卡中 - platform target = X86

  • 我试过这个,但它对我不起作用. (32认同)
  • 这在VS 2015上对我不起作用. (9认同)
  • 在VS2008中,我在"编译 - >高级编译选项..."(位于窗口选项卡底部)下找到了此选项,然后是"目标CPU"(x86) (7认同)
  • 这并不总是解决方案. (6认同)
  • 你救了我七个离岸银行账户、一个热狗摊和我的婚姻。谢谢 (6认同)
  • 也让我头疼. (3认同)
  • 我有相同的错误消息,但此解决方案不适合我. (2认同)

ste*_*ell 59

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

该网站可能以32位进程运行,这就是它可以使用该组件的原因.构建您的解决方案x86将强制您的服务以32位运行.


Dan*_*ger 58

我遇到了一个非常类似的问题.

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

对第三方DLL的调用是在Visual Studio中的单元测试中进行的,但是在具有80040154错误的同一台机器上的IIS中托管的Web应用程序中失败.

将应用程序池更改为"启用32位应用程序"解决了该问题.

  • 我真的很喜欢这个答案.当你在某个时刻只调用一个小的32位DLL时,为x86编译整个网站毫无意义. (6认同)
  • 我有同样的问题,但我不知道如何更改应用程序池,我应该在哪里执行此操作,请帮助我 (2认同)

小智 16

您不必配置项目属性平台目标X86.您还可以配置iis选项以使用x86

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


sha*_*oth 14

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


Jos*_*ner 14

如果您正在寻找一种在不重新编译Any CPU应用程序的情况下完成此工作的方法,那么这是另一种可能的解决方法:

  1. 在HKey_Classes_Root\Wow6432Node\CLSID\{GUID}下找到COM对象GUID
  2. 找到后添加一个新的REG_SZ(字符串)值.名称应为AppID,数据应与您刚刚搜索的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/


Edu*_*ier 8

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

只需在AppPool高级设置中设置"启用32位应用程序= True"即可.

它对我有用

  • AppPool 高级设置在哪里? (4认同)

小智 7

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)中

这个程序有效,没关系.


Ger*_*ell 6

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

解决方案有两个方面:

从Registery中删除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位注册并不能解决我的问题.


小智 5

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

我使用64位DLL将Windows服务项目设置为"Any-CPU".相同的错误消息.尝试了很多东西,但没有任何效果.最后,我进入项目Properties - > Build并注意到该项目已经选中了"Prefer 32-bit".取消选中此项,不再出现错误.

我的猜测是Windows服务期待一个32位的DLL,但找不到它.