Загрузка приложения .Net SideBySide не выполняется COMException (0x80040154) - PullRequest
0 голосов
/ 02 февраля 2019

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 и просто продолжает.

Любые советы по диагностике этой проблемы?

1 Ответ

0 голосов
/ 02 февраля 2019

Для всех, кто боролся, как я: насколько я понимаю, проблема была в SideBySide Cache .

Короче говоря, Windows кэширует информацию манифеста для приложения, иесли он определяет, что приложение не изменилось, использует кэш (вы заметите, что существующий внешний манифест никогда не загружается вашим процессом).

В моем случае исполняемый файл не изменился, но остальная часть приложения, включая информацию о манифесте.

Решение состоит в том, чтобы коснуться даты модификации исполняемого файла, в результате чего кэш стал недействительным.

В основном также ответили в на этот вопрос

...