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

检索的COM类工厂 带有CLSID的组件 {46521 b1f - 0 a5b - 4871 - a4c2 fd5c9276f4c6} 由于以下错误导致失败: 80040154.

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

有什么问题吗?


当前回答

在我个人的情况下,这个问题是固定的搜索类id在Windows的注册表上的开发机器(因为这个问题是抛出在客户端PC)。该操作将被放置到引起问题的COM组件中:我的. net项目中引用的x86库没有为安装程序或更新程序应用程序注册为OCX/COM。

问候

其他回答

我的问题是,我有错误的MS同步框架版本(1.0)在我的项目参考。更新到2.1版本后,错误消失了,生活又好了。

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

在我的情况下,我正在生成ms office文件,如word或excel,我运行Win+R并执行dcomcnfg,在DCOM配置中,除了选择office相关的名称项(如名称包含excel或word或office),并打开属性,选择身份选项卡并选择交互式用户。作为这个答案,

我的错误消息显示CLSID {000209FF-0000-0000-C000-000000000046},所以我必须尝试在DCOM配置中找到这个特定的CLSID,它确实存在,我选择它并遵循相同的步骤设置交互用户,然后它就工作了。

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

如果你正在寻找一种不需要重新编译任何CPU应用程序的方法,这里有另一种潜在的解决方案:

Locate your COM object GUID under the HKey_Classes_Root\Wow6432Node\CLSID\{GUID} Once located add a new REG_SZ (string) Value. Name should be AppID and data should be the same COM object GUID you have just searched for Add a new key under HKey_Classes_Root\Wow6432Node\AppID. The new key should be called the same as the COM object GUID. Under the new key you just added, add a new String Value, and call it DllSurrogate. Leave the value empty. Create a new Key under HKey_Local_Machine\Software\Classes\AppID\ Again the new key should be called the same as the COM object’s GUID. No values are necessary to be added under this key.

这个解决方案不是我的功劳,但它对我们很有效。查看源代码链接获取更多信息和其他评论。

来源:https://techtalk.gfi.com/32bit对象environment/——64位