.Net 应用程序 SideBySide 加载失败 COMException (0x80040154)
.Net Application SideBySide loading fails COMException (0x80040154)
我的 .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 Cache。
简而言之,Windows 缓存应用程序的清单信息,如果它确定应用程序没有更改,则使用缓存(您会注意到现有的外部清单永远不会被您的进程加载) .
在我的例子中,可执行文件没有改变,但应用程序的其余部分,包括清单信息。
解决办法是touch the modification date可执行文件,导致缓存失效
基本也在this question
里回答了
我的 .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 Cache。
简而言之,Windows 缓存应用程序的清单信息,如果它确定应用程序没有更改,则使用缓存(您会注意到现有的外部清单永远不会被您的进程加载) .
在我的例子中,可执行文件没有改变,但应用程序的其余部分,包括清单信息。
解决办法是touch the modification date可执行文件,导致缓存失效
基本也在this question
里回答了