.Net应用程序SideBySide加载失败COMException(0x80040154)

.Net Application SideBySide loading fails COMException (0x80040154)

本文关键字:0x80040154 COMException 失败 应用程序 SideBySide 加载 Net      更新时间:2023-10-16

My.Net 4.5.2 WPF应用程序部署到C:\Program Files\Folder A\FolderB。它由一个自定义部署服务复制到该位置,该服务基本上是一个具有一些附加功能的复制作业。应用程序本身是xcopy可部署的,前提是您安装了所需的C++运行时和.Net Framework。

该应用程序包括几个com组件,这些组件通过应用程序清单文件注册,过去工作得很好。更新应用程序二进制文件后,System.Activator.CreateInstance形式的几个调用失败

System.Runtime.InteropServices.COMException (0x80040154): Retrieving the COM class factory for component with CLSID {XXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXX} failed due to the following error: 80040154 Class not registered (Exception from HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG)).

如果我只是简单地将应用程序文件夹重命名为c:\Program Files\FolderA\FolderC,则一切正常

附加ProcessMonitor和WinDbg,我可以跟踪应用程序正在注册表中搜索给定的classid,但没有找到它,然后,如果从第一个文件夹启动,则会失败,如上所述。从重命名或复制的文件夹开始,进程加载相关的dll并继续。

关于诊断这个问题有什么提示吗?

对于像我一样挣扎的人来说:就我目前所见,问题是SideBySide缓存。

简而言之,Windows缓存应用程序的清单信息,如果它确定应用程序没有更改,则使用该缓存(您会注意到现有的外部清单从未由您的进程加载)。

在我的情况下,可执行文件没有更改,而是更改了应用程序的其余部分,包括清单信息。

解决方案是触摸可执行文件的修改日期,导致缓存失效。

基本上也回答了这个问题