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

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

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

有什么问题吗?


当前回答

在VS -项目属性-在Build选项卡-平台目标=X86

其他回答

在VS -项目属性-在Build选项卡-平台目标=X86

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

解决方案有两个方面:

从寄存器中删除64位。

c:\windows\system32\regsvr32.exe /U <file.dll> 这将不会删除对其他文件夹中复制的dll的引用。

or

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

将其注册为32位:

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

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

对于任何使用VSTO的人来说,我遇到的问题是缺少对办公室组件的引用。如果您试图手动实例化某些VSTO对象,也会出现这种情况。

我也遇到过类似的问题。

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

对第三方DLL的调用在Visual Studio中的单元测试中正常工作,但在同一台机器上的IIS中托管的Web应用程序中失败,并出现80040154错误。

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

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

问候