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