Переопределить механизм WinSxS в UWP. Специально для ComCtl32.dll
Я создаю универсальное приложение для Windows, которое использует динамическую библиотеку (wkhtmltopdf), которая, по-видимому, зависит от comctl32.dll в своей реализации Qt. Теперь я могу нормально запускать приложение на моей машине разработки (Windows 10 Pro 1607 Build 14393.1770), однако на целевой машине (Windows 10 Enterprise 2015 LTSB) я получаю следующую ошибку:
LdrpInitializeNode - ОШИБКА: сбой процедуры DLL 67ABDD60 для DLL "C:\Windows\WinSxS\x86_microsoft.windows.common-controls_6595b64144ccf1df_5.82.10240.16384_none_49c02355cf03478c\COMCTL32.dll" во время DLL_TAT_32.dll "
Когда я запустил приложение, я заметил, что на моем компьютере разработчика установлена другая версия этой библиотеки (5.82.14393.447). Я понимаю, что comctl32.dll 6.0 не распространяется, но я не видел того же замечания для 5.82. Я все еще решил упаковать свою версию библиотеки и позвонить LoadPackagedLibrary
вручную. Это на моем компьютере разработчика заканчивается загрузкой обеих версий (как показано в окне модулей Visual Studio); на моей целевой машине он загружает "более новую" версию, но пытается загрузить ее на WinSxS, и сбой все равно происходит:
LdrpPreprocessDllName - ИНФОРМАЦИЯ: DLL COMCTL32.dll была перенаправлена в C: \ Windows \ WinSxS \ x86_microsoft.windows.common-controls_6595b64144ccf1df_5.82.10240.16384_none_49c02355cf03478c \ COMCTL32.dll от SxS
Кажется, мне просто нужно, чтобы WinSxS не загружал свою версию ComCtl32.dll, так как я взломал, заменив C:\Windows\WinSxS\x86_microsoft.windows.common-controls_6595b64144ccf1df_5.82.10240.16384_none_49c02355cf03478c\COMCTL32.dll
в целевой машине с моей версией библиотеки. Однако это нежелательно.
Есть ли способ перераспределить рабочую версию ComCtl32.dll так, чтобы он не пытался загрузить ее из WinSxS? Возможно, через файл манифеста или запуск MSI на целевой машине?
1 ответ
Comctl32 вообще не поддерживается для UWP. Даже если вам удастся заставить его "работать", он может сломаться в любой момент времени - если вы запустите в своем проекте Windows App Certification Kit (WACK), это приведет к ошибкам.
Я уверен, что Fusion (поддерживающий привязку к различным версиям DLL) отключен и для UWP. Поскольку приложения являются автономными и не устанавливают / не используют системные библиотеки, такие как устаревшие приложения, перенаправление привязки не требуется.