如何修复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,现在工具正常工作。