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

问题描述 投票:268回答:17

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

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

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

可能是什么问题呢?

.net windows-services com-interop 32bit-64bit
17个回答
373
投票

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


5
投票

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

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

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


3
投票

要更改为x86:

  1. 为您的解决方案创建安装项目。
  2. 创建后,转到解决方案资源管理器,右键单击安装项目。 按Configuration Manager。 点击:“Active Solution Platform”组合框并选择New(如果没有显示x86) 从第一个组合x86中选择,然后按确定。 重建安装项目,然后重建所有项目。

3
投票

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


2
投票

在我个人的情况下,问题是修复了在开发人员机器上的Windows注册表中搜索类ID(因为问题是在客户端PC中抛出)。此操作将放入导致该问题的COM组件中:我的.NET项目中引用的x86库未被安装程序或更新程序应用程序注册为OCX / COM。

问候


1
投票

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


1
投票

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

首先从CMD提示符运行“Regedit.exe”(我将其安全级别提升为管理员,“以防万一”)然后搜索注册表(通过单击RegEdit菜单中的“编辑/查找”或按Ctrl + F)对于您收到的有关COM类工厂的错误消息中显示的CLSID。我的CLSID是29AB7A12-B531-450E-8F7A-EA94C2F3C05F。找到此密钥后,选择该Hive节点下的子项“InProcServer2”,并在右侧Regedit框架中确定问题DLL的文件名。显示在“默认”下。如果该文件位于“C:\ Windows \ SysWow64”(例如C:\ Windows \ SysWow64 \ Redemption.dll“)中,那么使用”C:\ Windows \ SysWow64 \ RegSvr32.exe“文件非常重要从命令行注册该DLL而不是默认的“C:\ Windows \ System32 \ RegSvr32.exe”文件。所以我运行了一个CMD提示符(在管理级别控制下(以防需要此级别)并键入命令行(在我的DLL的情况下):C:\ Windows \ SysWow64 \ RegSvr32.exe c:\ Windows \ SysWow64 \ Redemption.dll按下输入。关闭命令窗口(通过“退出”然后重新启动计算机(始终使用restart而不是Close Down然后启动,因为(奇怪)重启执行完全关闭并重新加载所有内容,而“关闭”和Power-Up重新加载存储的驱动程序缓存和其他值(可能有问题)。你将来注册一个DLL,记得使用SysWow64“RegSvr32.exe”存储在C:\ Windows \ SysWow64文件夹中的任何DLL和这个问题c(如果它是由我引起的不正确的注册)不应再发生。


0
投票

我的问题是我的项目参考中有错误的MS Sync FrameWork版本(1.0)。更新到2.1版之后,错误消失了,生活又恢复了。


0
投票

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

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


59
投票

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

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


57
投票

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

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

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

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


16
投票

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

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

14
投票

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


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/


8
投票

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

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

它对我有用


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

这个程序有效,没关系。


6
投票

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

解决方案有两个方面:

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

© www.soinside.com 2019 - 2024. All rights reserved.