检索具有CLSID {XXXX}的组件的COM类工厂失败,原因如下:80040154
我使用C#.NET开发了一个Windows服务来生成PDF报告。 生成PDF文件我正在使用第三方DLL。 该应用程序正在我的Windows XP平台上运行。 当我在Windows Server 2008 64位版本中部署服务时,出现此错误:
检索具有CLSID {46521B1F-0A5B-4871-A4C2-FD5C9276F4C6}的组件的COM类工厂失败,原因如下:80040154。
我使用regsvr32命令注册DLL。 我能够在registry中看到这个CLSID。 但问题依然存在。
可能是什么问题呢?
在VS – 项目属性 – 在生成选项卡 - 平台目标= X86
这听起来像您的服务是针对“任何CPU”构build的,导致您在使用COM组件时的64位错误。 您需要为x86
构build它。
该网站可能是作为一个32位进程运行,这就是为什么它可以使用该组件。 针对x86
构build解决scheme将强制您的服务以32位运行。
我遇到了一个非常类似的问题。
我需要在64位机器上开发的Web应用程序中使用旧的32位DLL。 我使用该文件夹中的regsrv32版本将32位DLL注册到了windows \ sysWOW64文件夹中。
调用第三方DLL从Visual Studio中的unit testing工作,但在80040154错误的同一台机器上的IIS中托pipe的Web应用程序失败。
将应用程序池更改为“启用32位应用程序”解决了此问题。
问题是服务器进程是64位,库是32位,它试图在同一进程(in-proc服务器)中创buildCOM组件。 或者重新编译服务器并将其设置为32位,或者保持服务器不变,并使COM组件处于进程外。 使COM服务器进程外的最简单方法是创build一个COM +应用程序 – 控制面板 – >pipe理工具 – > ComponentServices。
如果您正在寻找一种方法来使这个工作无需重新编译任何CPU应用程序,这是另一个潜在的解决方法:
- find您的COM对象GUID下的HKey_Classes_Root \ Wow6432Node \ CLSID \ {GUID}
- 一旦find添加一个新的REG_SZ(string)值。 名称应该是AppID,并且数据应该是您刚刚search的同一个COM对象GUID
- 在HKey_Classes_Root \ Wow6432Node \ AppID下添加一个新的密钥。 新的键应该被称为COM对象的GUID相同。
- 在刚刚添加的新密钥下,添加一个新的string值,并将其称为DllSurrogate。 保留空值。
- 在HKey_Local_Machine \ Software \ Classes \ AppID下创build一个新的密钥。再次,新的密钥应该和COM对象的GUID一样被调用。 这个键下不需要添加任何值。
我对这个解决scheme没有信任,但是它对我们有效。 检查来源链接了解更多信息和其他评论。
资料来源: http : //www.gfi.com/blog/32bit-object-64bit-environment/
您不必configuration您的项目属性平台目标X86。 你也可以像这样configurationiis选项来使用x86
- select应用程序池
- select您的应用使用的游泳池
- 高级设置
- 启用32位应用程序为true
Windows 2008 Server x64的解决scheme是:
- 使用pipe理员权限打开cmd.exe。
- 将该dll复制到文件夹C:\ Windows \ SysWOW64
- 从C:\ Windows \ SysWOW64运行regsvr32
- validation该DLL是在Windowsregistry中。
- 如果你有一个使用dll的.exe x86,则exe文件必须以x86模式编译。
- 该exe文件必须安装在文件夹C:\ Program Files(x86)
这个程序是有效的,没关系。
有一个不同的,但类似的修复相关的问题:
我有一个使用64位DLL设置为“Any-CPU”的Windows服务项目。 相同的错误讯息。 试了一大堆东西,但没有任何工作。 最后,我进入项目“属性” – >“生成”,并注意到该项目已选中“首选32位”。 取消选中这个,没有更多的错误。
我的猜测是,Windows服务期待一个32位的DLL,并找不到它。
我没有改变任何编译设置。
只需在AppPool高级设置中设置“启用32位应用程序=真”即可。
它为我工作
我有同样的问题,但其他答案只提供了解决scheme的一部分。
解决scheme有两个方面:
从registry中删除64位。
- c:\ windows \ system32 \ regsvr32.exe / U
- 这不会删除对其他文件夹中其他复制的dll的引用。
要么
- find名为HKEY_CLASSES_ROOT \ CLSID {……} \ InprocServer32的密钥。 这个键将把DLL的文件名作为默认值。
- 我删除了HKEY_CLASSES_ROOT \ CLSID {……}文件夹。
注册为32bit:
-
C:\Windows\SysWOW64\regsvr32 <file.dll>
注册为32位而不删除64位注册不能解决我的问题。
要更改为x86:
- 为您的解决scheme创build一个安装项目。
- 创build后,转到解决scheme资源pipe理器,右键单击安装项目。
- 按configurationpipe理器。
- 点击:“Active Solution Platform”combobox并selectNew(如果没有显示x86)
- 从第一个组合x86中select,然后按OK。
- 重build安装项目,然后重build所有的项目。
如果您正在运行网站,则还可以尝试设置应用程序池以禁用32位应用程序(在高级设置的池下)。
对于任何使用VSTO的人来说,对我来说这个问题是缺less对office
assembly的参考。 如果您尝试手动实例化某些VSTO对象,也会出现这种情况。
在我个人的情况下,这个问题是固定的searchWindowsregistry中的开发人员的机器上的类ID(因为问题是抛出在客户端PC)。 这个动作将被放置到导致问题的COM组件中: 在我的.NET项目中引用的一个x86库,它没有被注册为安装程序或更新程序的OCX / COM 。
问候
我的问题是我的项目引用中有错误的MS Sync FrameWork版本(1.0)。 更新到2.1版之后,错误消失了,生活又恢复了良好。