由于以下错误,检索 CLSID 为 {XXXX} 的组件的 COM 类工厂失败:80040154
-
10-07-2019 - |
题
我使用 C#.NET 开发了一个 Windows 服务来生成 PDF 报告。为了生成 PDF 文件,我使用第三方 dll。该应用程序正在我的 Windows XP 平台上运行。当我将服务部署在 Windows Server 2008 64 位版本,我收到此错误:
通过CLSID检索组件的COM类工厂{46521B1F-0A5B-4871-A4C2-FD5C9276F4C6}因以下错误而失败。80040154。
我使用 regsvr32 命令注册了 DLL。我能够在注册表中看到这个 CLSID。但问题仍然存在。
可能是什么问题呢?
解决方案
在VS - 项目属性中 - 在Build选项卡中 - platform target = X86
其他提示
听起来您的服务是针对“任何CPU”构建的,导致您在使用COM组件的64位上出错。您需要为x86
构建它。
该网站可能以32位进程运行,这就是它可以使用该组件的原因。针对<=>构建解决方案将强制您的服务以32位运行。
我遇到了一个非常类似的问题。
我需要在64位计算机上开发的Web应用程序中使用旧的32位DLL。我使用该文件夹中的regsrv32版本将32位DLL注册到windows \ sysWOW64文件夹中。
第三方DLL的调用是从Visual Studio中的单元测试开始的,但是在同一台机器上的IIS中托管的Web应用程序失败时出现80040154错误。
将应用程序池更改为<!>“启用32位应用程序<!>”;解决了这个问题。
您不必配置项目属性平台目标 X86。您还可以配置 iis 选项以与 x86 一起使用,如下所示
- 选择应用程序池
- 选择您的应用程序使用的池
- 高级设置
- 启用 32 位应用程序 真的
如果您正在寻找一种在不重新编译Any CPU应用程序的情况下完成此工作的方法,那么这是另一种可能的解决方法:
- 在HKey_Classes_Root \ Wow6432Node \ CLSID \ {GUID} 下找到您的COM对象GUID
- 找到后添加一个新的REG_SZ(字符串)值。名称应为AppID,数据应与您刚搜索的相同COM对象GUID
- 在HKey_Classes_Root \ Wow6432Node \ AppID下添加新密钥。新密钥应该与COM对象GUID相同。
- 在刚添加的新密钥下,添加一个新的字符串值,并将其命名为DllSurrogate。保留该值为空。
- 在HKey_Local_Machine \ Software \ Classes \ AppID \下创建一个新密钥 同样,新密钥应该与COM对象<!>#8217; s GUID相同。此密钥下无需添加任何值。 醇>
我不赞成这个解决方案,但它对我们有用。查看源链接以获取更多信息和其他评论。
问题是服务器进程是64位且库是32位,它尝试在同一进程(进程内服务器)中创建COM组件。要么重新编译服务器并将其设置为32位,要么保持服务器不变,并使COM组件处于进程外。使COM服务器进程外的最简单方法是创建COM +应用程序 - 控制面板 - <!> gt;管理工具 - <!> gt; ComponentServices。
我没有更改任何编译设置。
设置<!>;启用32位Application = True <!>;在AppPool高级设置中。
它对我有用
Windows 2008服务器x64的解决方案是:
- 以管理员权限打开cmd.exe。
- 将dll复制到文件夹C:\ Windows \ SysWOW64
- 从C:\ Windows \ SysWOW64 运行regsvr32
- 验证dll是否在Windows的注册表中。
- 如果你有一个使用dll的.exe x86,exe必须在x86模式下编译。
- exe必须安装在文件夹C:\ Program Files(x86) 中 醇>
此程序有效,没关系。
有一个相关问题,但有一个不同的,但类似的修复:
我将Windows服务项目设置为<!>“Any-CPU <!>”;使用64位DLL。相同的错误消息。尝试了很多东西,但没有任何效果。最后,我进入了项目属性 - <!> gt;构建并注意到该项目有<!>“;首选32位<!>”;检查。取消选中此项,不再出现错误。
我的猜测是Windows服务期待一个32位的DLL,但找不到它。
我遇到了同样的问题,但其他答案只提供了解决方案的一部分。
解决方案有两个方面:
从注册表中删除 64 位。
- c:\windows\system32 egsvr32.exe /U
- 这不会删除对其他文件夹中 dll 的其他副本的引用。
或者
- 找到名为 HKEY_CLASSES_ROOT\CLSID{......}\InprocServer32 的键。该键将 DLL 的文件名作为其默认值。
- 我删除了 HKEY_CLASSES_ROOT\CLSID{......} 文件夹。
将其注册为 32 位:
C:\Windows\SysWOW64\regsvr32 <file.dll>
将其注册为 32 位而不删除 64 位注册并不能解决我的问题。
要更改为 x86:
- 为您的解决方案创建一个安装项目。
- 创建后,转到解决方案资源管理器,右键单击安装项目。
- 按配置管理器。
- 点击:“Active Solution Platform”组合框并选择“新建”(如果没有显示 x86)
- 从第一个组合 x86 中选择,然后按 OK。
- 重建安装项目,然后重建所有项目。
如果您正在运行网站,您还可以尝试将应用程序池设置为禁用32位应用程序(在池的高级设置下)。
对于使用VSTO的任何人来说,对我来说问题是缺少对office
程序集的引用。如果您尝试手动实例化某些VSTO对象,也会出现。
在我个人的情况下,问题是修复了在开发人员计算机上的Windows注册表中搜索类ID(因为问题是在客户端PC中引发的)。此操作将放入导致该问题的COM组件中:我的.NET项目中引用的x86库,该库未被注册为安装程序或更新程序应用程序的OCX / COM 。
此致
我的问题是我的项目参考中有错误的MS Sync FrameWork版本(1.0)。更新到2.1版之后,错误消失了,生活又恢复了。
我发现我的问题与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 <!>”是很重要的。文件从命令行注册该DLL而不是默认的<!>“C:\ Windows \ System32 \ RegSvr32.exe <!>”;文件。 所以我运行了CMD提示符(在管理级别控制下(以防需要此级别)并在命令行上键入(在我的DLL的情况下): C:\ Windows \ SysWow64 \ RegSvr32.exe c:\ Windows \ SysWow64 \ Redemption.dll 按下输入。 关闭命令窗口(通过<!>“;退出<!>”;然后重新启动您的计算机(始终使用重启而不是关闭然后启动,因为(奇怪)重启执行完全关闭并重新加载所有内容而<!>“;关闭<!>”;并且Power-Up重新加载存储的驱动程序缓存和其他值(可能有问题)。 无论何时注册DLL,请记住使用SysWow64 <!>“RegSvr32.exe <!>”;对于存储在C:\ Windows \ SysWow64文件夹中的任何DLL,此问题c(如果它是由不正确的注册引起)不应该再次发生。
在我的情况下,我正在生成ms office文件,如word
或excel
,我在DCOM配置中运行Win+R
并执行dcomcnfg
,除了选择OFFICE相关的名称项(例如名称包含) Excel
或Word
或Office
)和Open the properties, select Identity tab and select the interactive user.
as 这个答案,
我的错误消息显示CLSID {000209FF-0000-0000-C000-000000000046}
,所以我必须尝试在DCOM配置中找到这个特定的CLSID,它确实存在,我选择它并按照相同的步骤设置interactive user
,然后它可以工作。