296

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

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

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

可能是什么问题呢?

4

17 回答 17

393

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

于 2010-05-23T16:44:30.040 回答
63

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

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

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

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

于 2010-07-27T21:31:40.417 回答
60

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

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

于 2009-06-24T08:07:49.193 回答
19

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

  • 选择应用程序池
  • 选择您的应用使用的池
  • 高级设置
  • 启用 32 位应用程序true
于 2014-01-13T09:38:48.290 回答
17

如果您正在寻找一种无需重新编译 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. 在刚刚添加的新键下,添加一个新的字符串值,并将其命名为 DllSurrogate。将该值留空。
  5. 在 HKey_Local_Machine\Software\Classes\AppID\ 下创建一个新密钥,新密钥的名称应与 COM 对象的 GUID 相同。无需在此键下添加任何值。

我不相信这个解决方案,但它对我们有用。检查源链接以获取更多信息和其他评论。

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

于 2013-01-11T19:52:49.653 回答
14

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

于 2009-06-24T08:17:01.313 回答
8

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

解决方案有两个:

从寄存器中删除 64 位。

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

或者

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

将其注册为 32 位:

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

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

于 2014-07-25T21:06:17.240 回答
8

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

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

它对我有用

于 2014-10-20T11:51:16.290 回答
7

windows 2008 server 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)

这个程序有效,没问题。

于 2011-04-13T14:55:28.090 回答
5

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

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

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

于 2012-12-28T02:37:10.333 回答
3

要更改为 x86:

  1. 为您的解决方案创建一个安装项目。
  2. 创建后,转到解决方案资源管理器,右键单击安装项目。
    • 按配置管理器。
    • 点击:“Active Solution Platform”组合框并选择New(如果没有显示x86)
    • 从第一个组合 x86 中选择,然后按 OK。
    • 重建安装项目,然后重建所有项目。
于 2011-03-19T09:08:36.220 回答
3

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

于 2011-05-19T17:43:13.930 回答
2

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

问候

于 2017-02-02T15:09:03.773 回答
2

我发现我的问题与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按回车。
  • 关闭命令窗口(通过“退出”然后重新启动计算机(始终使用重新启动而不是关闭然后启动,因为(奇怪)重新启动执行彻底关闭并重新加载所有内容,而“关闭”和加电重新加载存储的驱动程序缓存和其他值(可能有问题)。
  • 以后无论何时注册 DLL,请记住对存储在 C:\Windows\SysWow64 文件夹中的任何 DLL 使用 SysWow64“RegSvr32.exe”,并且此问题 c(如果是由错误注册引起的)应该不会再次发生。
于 2018-11-30T00:34:23.030 回答
1

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

于 2015-05-27T16:56:49.273 回答
0

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

于 2015-09-18T21:42:22.720 回答
0

就我而言,我正在生成 ms office 文件,例如wordor excel,我在 DCOM 配置中运行Win+R并执行dcomcnfg,除了选择与 OFFICE 相关的名称项目(例如名称包含ExcelorWordOffice)并Open the properties, select Identity tab and select the interactive user.作为这个答案

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

于 2019-02-21T16:55:41.517 回答