【问题标题】:.Net Application SideBySide loading fails COMException (0x80040154).Net Application SideBySide 加载失败 COMException (0x80040154)
【发布时间】:2019-06-26 13:10:26
【问题描述】:

我的 .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 并继续进行。

有关诊断此问题的任何提示?

【问题讨论】:

  • 请更新您的问题以包含清单文件的内容。

标签: c# c++ .net com


【解决方案1】:

致所有像我一样苦苦挣扎的人:据我目前所见,问题出在SideBySide Cache

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

在我的例子中,可执行文件没有改变,但应用程序的其余部分,包括清单信息。

解决办法是touch the modification date的可执行文件,导致缓存失效。

基本上也在this question回复

【讨论】:

  • 在 Windows 10 上尤其如此。根据我在 Windows 7 上的经验,有时注销/登录会导致缓存重置,有时会导致重新启动。然而,对于 Windows 10,它似乎被永远缓存了......唯一的解决方案就是触摸。
猜你喜欢
  • 2012-05-17
  • 2011-05-01
  • 2015-05-04
  • 1970-01-01
  • 2014-06-24
  • 2018-10-10
  • 2014-07-06
  • 2015-08-17
  • 2014-07-04
相关资源
最近更新 更多