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


278

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

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

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

可能是什么问题呢?


1
托管在同一服务器上的Web应用程序能够生成PDF文件,而不会出现任何错误。
gopal

伙计们,我尝试了所有可能的解决方案,但仍然收到此错误。我有程序集并成功注册了它们,但仍然遇到相同的错误。确实需要帮助...
newprogress

Answers:


383

在VS中-项目属性-在“构建”选项卡中-平台目标= X86


7
在VS2008中,我在“编译”->“高级编译选项...”(位于窗口选项卡底部)下找到了该选项,然后在“目标CPU”(x86)下找到
Rodolfo

1
您值得拥有的不仅仅是+1,但我只需要给+1
大卫

7
这并不总是解决方案。

2
您为我节省了七个离岸银行帐户,一个热狗摊位和我的婚姻。谢谢
唐纳德。

2
我有相同的错误消息,但此解决方案不适用于我。
阿克拉姆汗

59

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

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

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

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


1
这是我找到的解决此问题的最简单方法。谢谢!
dexter 2012年

6
我真的很喜欢这个答案。当您只在某个时刻调用一个很小的32位DLL时,就没有必要为x86编译整个网站。
DanM7 2012年

@Daniel Ballinger我的应用程序在进行更改时是否可以以32位进程运行?
2014年

@Danny我不这样认为,因为它无法访问我注册到sysWOW64中的DLL。
Daniel Ballinger 2014年

1
我有同样的问题,但我不知道如何更改应用程序池,请问该在哪里做,请帮助我
Shima.Y

58

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

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


我也面临着同样的问题..这里我的桌面应用程序已成功安装在64位系统上。.在安装过程中,我成功完成了同步,但是当我从软件进行同步时,它显示出上面的错误
Mohini Mhetre 2014年

我正在尝试注册,.ocx file (c:\Windows\SysWow>RegSvr32 genX.ocx)但出现错误模块无法加载。确保二进制文件存储在指定的路径或对其进行调试,以检查二进制文件或相关的.DLL文件是否存在问题。
纳文·库玛

如果将其编译为32位,则应使用系统regsvr32,而不是SysWow64版本。
Fandango68年

运行SSIS包时出现此错误。连接工作正常。所有属性都是正确的。实际上,SSIS包已经运行了许多个月,没有任何错误。突然我遇到了错误。我尝试将运行时/调试从x64更改为x86,但问题尚未解决。
IamVISH

16

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

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

对我而言,这一直是正确的。无需将平台目标设置为X86,而是始终执行以下操作:•启用32位应用程序= True•设置标识= ApplicationPoolIdentity•加载用户配置文件= True
Zath。

我有一个类似的问题,该问题已按照Nazim的说明进行了修复,但也没有设置“嵌入互操作类型”(引用的dll的属性),并设置了Copy Local = true。
cymorg

您如何“选择应用程序池”?
CodyBugstein,

“应用程序池”菜单在左侧iis菜单列表中
nazim hatipoglu,

16

如果您正在寻找一种无需重新编译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/


1
最出色的说明。我使用的是第三方工具,因此无法更改构建平台。此解决方案避免了该问题。谢谢!

我已经按照步骤1中的描述找到了密钥,然后我知道是哪个COM对象引起了麻烦,然后才在其上运行regsvr32。非常感谢!
MichaelS 2014年

当我这样做时,我的本地Web服务器(IIS)开始被拒绝访问。这告诉我这是朝着正确方向迈出的一步,但目前还不确定谁可以访问。 stackoverflow.com/questions/14019401/...
user420667

14

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


尝试创建COM +应用程序时遇到错误。An error occurred while processing the last operation. [Error code 00690075] The event log may contain additional troubleshooting information.
KZee


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

此过程有效,可以。


6

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

解决方案有两个:

从寄存器中删除64位。

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

要么

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

将其注册为32bit:

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

将其注册为32位而不删除64位注册不能解决我的问题。


答对了!这就是我一直在寻找的答案(请参阅其他地方的评论)。谢谢!
Fandango68年

5

发生了一个相关问题,但有不同但相似的修复程序:

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

我的猜测是Windows服务期望使用32位DLL,但找不到它。


虽然那很奇怪,但它确实有效!谢谢
FindOutIslamNow

3

更改为x86:

  1. 为您的解决方案创建一个安装项目。
  2. 创建它之后,转到解决方案资源管理器,右键单击安装项目。
    • 按配置管理器。
    • 单击:“活动解决方案平台”组合框,然后选择“新建”(如果未显示x86)
    • 从第一个组合x86中选择,然后按OK。
    • 重建安装程序项目,然后重建所有项目。

3

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


2
相反,我不得不启用32位应用程序。
2012年

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: C:\ Windows \ SysWow64 \ RegSvr32.exe c:\ Windows \ SysWow64 \ Redemption.dll,按Enter键。关闭命令窗口(通过“退出”,然后重新启动计算机(始终使用重新启动而不是“关闭”,然后重新启动),因为(奇怪的)重新启动会彻底关闭并重新加载所有内容,而“关闭”和上电会重新加载存储的驱动程序和其他值的缓存(可能有问题),以后每当您注册一个DLL时,切记对C:\ Windows \ SysWow64文件夹中存储的任何DLL使用SysWow64“ RegSvr32.exe”,并且此问题c (如果是由于错误的注册引起的),则不会再次发生。


很好的技巧,但请注意,在SysWow64中注册32位DLL会假定该DLL具有包装程序来处理64位请求。
Fandango68年

0

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


0

就我而言,我在DCOM Config中生成ms办公文件,例如wordexcel,然后运行Win+R并执行dcomcnfg,除了选择OFFICE相关的名称项(例如名称包含ExcelWordOffice),Open the properties, select Identity tab and select the interactive user.以此回答

我的错误消息show CLSID {000209FF-0000-0000-C000-000000000046},所以我必须尝试在DCOM Config中找到此特定的CLSID,并且确实存在,因此我选择了它并按照相同的步骤设置interactive user,然后它起作用了。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.