Частная неуправляемая проблема сборки бок о бок - PullRequest
3 голосов
/ 06 февраля 2010

У нас есть большое приложение MFC, которое использует несколько библиотек DLL. До сих пор мы использовали vcredist_x86.exe для установки MFC и CRT в неуправляемый параллельный кэш сборок (C: \ Windows \ WinSxS). Когда MFC / CRT устанавливается таким образом, приложение запускается (на чистой машине с XP).

Согласно документации MSDN вы можете установить MFC / CRT, скопировав файлы сборки в папку, в которую установлено ваше приложение. Я проверил это с помощью простого приложения MFC, и оно работает. Но у меня проблемы с тем, чтобы заставить наше большое приложение MFC работать с использованием этого подхода.

Похоже, что проблема вызвана тем, что некоторые библиотеки DLL имеют манифесты, ссылающиеся, например, на более раннюю версию CRT, одна библиотека содержит следующий манифест.

<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<dependency>
<dependentAssembly>
<assemblyIdentity type="win32" name="Microsoft.VC80.CRT" version="8.0.50215.4652" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b" /> 
</dependentAssembly>
</dependency>
</assembly>

Мы копируем версию 8.0.50727.762 сборки CRT в папку нашего приложения. Как вы можете видеть, это более новая версия CRT. Но по какой-то причине загрузчик ОС не может загрузить DLL с указанным выше манифестом. Этого не происходит, если в WinSxS установлена ​​такая же сборка CRT. Когда я отслеживаю загрузку с помощью DependencyWalker, я получаю сообщение об ошибке LDR: LdrpWalkImportDescriptor () не удалось обнаружить c: \ Documents and settings \ qatest \ desktop \ test \ log4cpp.dll для его манифеста, ntstatus 0xc0150002

Кажется, что способность загрузчика загружать более новую версию сборки не работает при использовании закрытых сборок рядом, но она работает, когда сборки установлены в WinSxS.

Есть ли решение для этого?

1 Ответ

1 голос
/ 30 июня 2010

Я думаю, что ответ сводится к Политике издателя CRT.Посмотрите, например, c:\windows\winsxs\Manifests\x86_policy.9.0.microsoft.vc90.crt_1fc8b3b9a1e18e3b_9.0.30729.4148_none_f47e1bd6f6571810.manifest.Это указывает, что приложения, которые ссылаются на более старую версию CRT, должны загружать эту версию вместо этого.

Что нужно сделать, чтобы выполнить перенаправление без установки vcredist, это либо изменить манифест, либо написать libraryX.dll.config (или, возможно, libraryX.dll.2.config), чтобы перенаправить привязку.

См. мой post для примера конфигурации.Обратите внимание, что вам не нужно <publisherPolicy apply="no"/>;Политика издателя должна применяться для закрытия дыр в безопасности.

Обязательно тестируйте на разных версиях Windows, так как SxS может работать немного по-разному.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...