.NET应用程序SideBySide加载失败收到COMException(0x80040154的)

时间:2019-02-01 23:06:31

标签: c# c++ .net com

我的.Net 4.5.2 WPF应用程序已部署到C:\ Program Files \ Folder A \ FolderB。它是通过自定义部署服务复制到该位置的,该服务基本上是具有某些附加功能的复制作业。如果您具有必需的C ++运行时,并且已安装.Net Framework,则应用程序本身可以进行xcopy部署。

该应用程序包括几个通过应用程序清单文件注册的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,然后继续。

是否有诊断此问题的提示?

1 个答案:

答案 0 :(得分:0)

对于像我一样挣扎的任何人:就我目前所见,问题出在SideBySide Cache上。

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

就我而言,可执行文件没有更改,但是应用程序的其余部分(包括清单信息)没有改变。

解决方案是对touch the modification date的可执行文件进行操作,从而使缓存失效。

基本上也用this question回答