Как определить, какая Dll-зависимость не загружается в Windows Store/Universal Apps?
При запуске проекта UWP, над которым я работаю, я получаю следующий диалог.
"Не удалось активировать приложение Магазина Windows" MyAppsMangledName ". Процесс" MyExeName "запущен, но запрос на активацию завершился неудачно с ошибкой" Приложение не запустилось "."
Вывод Visual Studio имеет следующее.
Нить 0x3d4c вышла с кодом -1073741515 (0xc0000135). Нить 0x3b50 вышла с кодом -1073741515 (0xc0000135). Программа "MyExeName" вышла с кодом -1073741515 (0xc0000135) "Зависимый dll не найден".
Просмотр событий имеет 3 события, которые в основном перезаписывают всплывающее диалоговое окно тремя различными способами и ничем иным.
Запуск Process Monitor во время запуска показывает, что многие dll успешно загружены, но ничего не указывает на сбой, кроме некоторых событий NAMENOTFOUND, которые, к сожалению, не показывают, какое имя не было найдено.
В Win32 полезный диалог обычно указывает, какую dll не удалось загрузить. И, конечно же, с приложениями.Net журналы Fusion позволяют отслеживать это очень просто. Но для приложений Store/UWP я не могу найти хороший способ отследить оскорбительную зависимость.
1 ответ
Это также ударило меня по проекту, над которым я работаю. И после долгих раскопок кто-то из моей команды смог понять это. Так решил, что поделюсь этим для других, борющихся с той же проблемой.
Мы делаем UWP с C++, используя VS2015. Поэтому, имея в виду, есть программа gflags, расположенная для меня по адресу C:\program Files (x86)\Windows Kits 10\Debuggers\x64\gflags.exe
Поэтому вам нужно окно cmd с администратором и запустить команду gflags.exe -i your-program-name.exe +sls
Примечание: gflags не было в моем пути, поэтому либо добавьте путь, либо перейдите туда, где он находится, перед выполнением команды.
Просто передайте имя exe без каталогов. Что он делает, так это устанавливает параметр реестра для VS, который включает sls (show snaps snaps) для exe, совпадающего с этим именем. Затем запустите ваше приложение в VS, и вы получите большое количество информации о загрузке DLL, включая имена DLL, которые не загружаются в вашем окне вывода. В нашем случае это было так:
5038: 34f4 @ 789320468 - LdrpProcessWork - ОШИБКА: невозможно загрузить DLL: "vccorlib140d_app.DLL", родительский модуль: "E:\projects---\Source\Builds\vs2015_Debug_UWP_x64\AppX---. Exe", статус: 0xc00001
Другой более быстрый альтернативный способ проверить это (YMMV) - сравнить вывод с другой конфигурацией сборки, которая работает. В нашем случае мы можем просто запустить релизные сборки, но отладочные сборки barf. И выходные данные выпуска показали, что vccorlib140_app.dll загружен, в то время как в отладке он отсутствует.