【问题标题】:Retrieving the COM class factory for component with CLSID {XXXX} failed due to the following error: 80040154由于以下错误,检索具有 CLSID {XXXX} 的组件的 COM 类工厂失败:80040154
【发布时间】:2010-11-05 10:19:33
【问题描述】:

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

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

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

可能是什么问题?

【问题讨论】:

  • 托管在同一服务器上的 Web 应用程序能够生成 PDF 文件而不会出现任何错误。
  • 伙计们,我尝试了所有可能的解决方案,但仍然出现此错误。我有程序集并成功注册它们,但仍然出现同样的错误。真的需要帮助...

标签: .net windows-services com-interop 32bit-64bit


【解决方案1】:

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

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

【讨论】:

  • 我也面临同样的问题..这里我的桌面应用程序在 64 位系统上成功安装..在安装时我成功完成了同步但是当我从我的软件进行同步时它显示我上面的错误
  • 我正在尝试注册.ocx file (c:\Windows\SysWow>RegSvr32 genX.ocx),但出现错误模块加载失败。确保二进制文件存储在指定路径或对其进行调试以检查二进制文件或相关 .DLL 文件是否存在问题。
  • 如果编译为32位,那么应该使用系统regsvr32,而不是SysWow64版本。
  • 我在运行 SSIS 包时收到此错误。连接工作正常。所有属性都是正确的。实际上,SSIS 包已经运行了好几个月,没有任何错误。突然我得到了错误。我尝试将运行时/调试从 x64 更改为 x86,但问题仍未解决。
【解决方案2】:

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

【讨论】:

  • 我在尝试创建 COM+ 应用程序时遇到错误。 An error occurred while processing the last operation. [Error code 00690075] The event log may contain additional troubleshooting information.
【解决方案3】:

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

【讨论】:

  • 在 VS2008 中我在 'Compile->Advanced Compile Options...' (在窗口选项卡的底部)和 'Target CPU' (x86) 下找到了这个选项
  • 如果它在 64 位浏览器上运行会如何?
  • 这并不总是解决办法。
  • 你救了我七个离岸银行账户、一个热狗摊和我的婚姻。谢谢
  • 我有同样的错误信息,但这个解决方案对我不起作用。
【解决方案4】:

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

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

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

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

【讨论】:

  • 这是我发现解决此问题的最简单方法。谢谢!
  • 我真的很喜欢这个答案。当您在某个时候只调用一个微小的 32 位 DLL 时,为 x86 编译整个网站是没有意义的。
  • @Daniel Ballinger 在进行更改时我的应用程序会以 32 位进程运行吗?
  • @Danny 我不相信,因为它无法访问我在 sysWOW64 中注册的 DLL。
  • 我有同样的问题,但是我不知道如何更改应用程序池,我应该在哪里做,请帮助我
【解决方案5】:

要更改为 x86:

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

【讨论】:

    【解决方案6】:

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

    这个程序有效,没问题。

    【讨论】:

      【解决方案7】:

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

      【讨论】:

      • 我的情况正好相反,必须启用 32 位应用程序。
      【解决方案8】:

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

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

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

      【讨论】:

      • 虽然这很奇怪,但它确实有效!谢谢
      【解决方案9】:

      如果您正在寻找一种无需重新编译 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 相同。无需在此键下添加任何值。

      我对这个解决方案不以为然,但它对我们有用。查看源链接以获取更多信息和其他 cmets。

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

      【讨论】:

      • 最优秀的说明。我使用的是第三方工具,无法更改构建平台。这个解决方案绕过了这个问题。谢谢!
      • 我已经找到了您在步骤 1 中描述的密钥,然后我知道是哪个 COM 对象造成了麻烦,然后我就在其上运行 regsvr32。非常感谢!
      • 当我这样做时,我的本地网络服务器 (IIS) 开始被拒绝访问。这告诉我这是朝着正确方向迈出的一步,但我不确定目前该向谁提供访问权限。 stackoverflow.com/questions/14019401/…
      • HKEY_CLASSES_ROOT 是 HKEY_LOCAL_MACHINE\SOFTWARE\Classes 与 CURRENT_USER\SOFTWARE\Classes 合并。其下的 AppID 由 32 位和 64 位平台共享。所以,(我相信)第 3 步是不正确的,因为 AppID 不应该是 32 位特定的。鉴于上述情况,我建议第 5 步应替换第 3 步,并删除(第 5 步的)最后一句。
      【解决方案10】:

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

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

      【讨论】:

      • 这对我来说一直都是正确的。不必将平台目标设置为 X86,但总是 • 启用 32 位应用程序 = True • 设置身份 = ApplicationPoolIdentity • 加载用户配置文件 = True
      • 我有一个类似的问题,已按照 Nazim 的说明进行了修复,但也必须不“嵌入互操作类型”(引用的 dll 的属性)并设置 Copy Local = true。
      • 如何“选择应用程序池”?
      • Application Pools 菜单在左侧的 iis 菜单列表中
      • 即使对我来说更新应用程序池以启用 32 位工作。谢谢@nazimhatipoglu
      【解决方案11】:

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

      解决方法有两个:

      从寄存器中删除 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>

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

      【讨论】:

      • 宾果游戏!这就是我一直在寻找的答案(请参阅我的 cmets 其他地方)。谢谢!
      【解决方案12】:

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

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

      它对我有用

      【讨论】:

      • AppPool 高级设置在哪里?
      【解决方案13】:

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

      【讨论】:

        【解决方案14】:

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

        【讨论】:

          【解决方案15】:

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

          问候

          【讨论】:

            【解决方案16】:

            我发现我的问题与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(如果它是由错误注册引起的)不应该再次发生。

            【讨论】:

            • 很好的提示,但请注意,在 SysWow64 中注册 32 位 DLL,然后假定 DLL 具有处理 64 位请求的包装器。
            【解决方案17】:

            在我的例子中,我正在生成像wordexcel 这样的ms office 文件,我在DCOM Config 中运行Win+R 并执行dcomcnfg,除了选择与OFFICE 相关的名称项(例如名称包含Excel or Word or Office) 和 Open the properties, select Identity tab and select the interactive user. as this answer,

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

            【讨论】:

              猜你喜欢
              • 2013-01-29
              • 2013-12-10
              • 1970-01-01
              • 2010-09-21
              • 2011-10-24
              • 2023-03-27
              • 2012-08-29
              • 2011-10-05
              相关资源
              最近更新 更多