如何修复COMException错误80040154?

将正在运行的C#项目从64位Windows 7计算机移到32位XP计算机上导致以下错误:

检索具有CLSID {681EF637-F129-4AE9-94BB-618937E3F6B6}的组件的COM类工厂失败,原因如下:80040154。

681EF637-F129-4AE9-94BB-618937E3F6B6不在registry中,因此没有正确安装,但这是以前在64位Windows 7计算机上出现问题的相同ID。 这个64位Windows 7机器上的这个错误的解决scheme在这里find了 (将Platform Target更改为x86),但是这并不能解决32位XP机器上的问题。 如何find与681EF637-F129-4AE9-94BB-618937E3F6B6相关的DLL,或者更好,我该如何修复这个exception?

要findDLL,请转到您的64位机器并打开registry。 find名为HKEY_CLASSES_ROOT\CLSID\{681EF637-F129-4AE9-94BB-618937E3F6B6}\InprocServer32 。 这个键将把DLL的文件名作为默认值。

如果您通过重新编译x86项目来解决64位计算机上的问题,则需要查看registry的32位部分,而不是正常位置。 这是HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Classes\CLSID\{681EF637-F129-4AE9-94BB-618937E3F6B6}\InprocServer32

如果DLL是为32位构build的,那么你可以直接在你的32位机器上使用它。 如果它的内置64位,那么你必须联系供应商,并从他们获得一个32位版本。

当您有DLL时,通过运行c:\ windows \ system32 \ regsvr32.exe注册它。

我在Windows服务中遇到同样的问题。 所有的键都在registry的正确位置。 服务的构build是为x86完成的,我仍然有例外。 我发现了CorFlags.exe

在没有标志的情况下在service.exe上运行此命令,以validation您是否在32位下运行。 如果没有运行它的标志/32BIT+ /Force (强制只签署的程序集)

如果您有UAC打开,您可以得到以下错误: corflags : error CF001 : Could not open file for writing使用户完全控制程序集。

控制台输出

解决方法:

可能的解决方法是将项目的平台从“任何CPU”修改为“X86”(在项目的属性,构build/平台的目标中)

根本原因

VSS Interop是使用32位框架的托pipe程序集,并且该DLL包含一个32位COM对象。 如果您在64位环境中运行此COM DLL,您将收到错误消息。

将全局variables的excelvariables声明在你的表单中,就像我的表单一样:

 Dim xls As New MyExcel.Interop.Application Dim xlb As MyExcel.Interop.Workbook 

上面两行是我的forms声明全球所以我把这两行到本地function,现在工具正常工作。