У нас есть большое приложение 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.
Есть ли решение для этого?