Howto: несколько версий msvcrt9 как частные сборки SxS?
У меня есть проект, который состоит из предварительно собранных модулей Dll, созданных некоторое время назад с использованием Visual Studio 9.
EXE-файл проекта теперь собран, используя SP1 Visual Studio 9.
При развертывании EXE мы не хотим требовать административного доступа, поэтому C-Runtime был включен в корень приложения. The Dlls: MSVCRT90.DLL и их манифест: Microsoft.VC90.CRT.manifest
Теперь все EXE-файлы и последние версии манифестов времени выполнения согласованы - манифест приложения запрашивает 9.0.30729.1 файла msvcrt.dll, а crt-манифест содержит записи, подтверждающие, что msvcrt90.dll - версия 9.0.30729.1.
Теперь проблема. Сторонняя библиотека DLL, используемая нашим приложением, была связана с исходной версией msvcrt90.dll 9.0.21022.8 и имеет внутренний манифест для этого.
Приложение работает на наших ПК для разработки, на которых установлены обе версии VS9 CRuntime. На "свежих" ПК, где мы впервые устанавливаем приложение - DLL не загружается.
Теперь у меня есть несколько читов, которые я могу сделать - один - вернуть приложение в 9.0.2 - получить библиотеки DLL 9.0.2 с исходного носителя. Это нежелательно, так как 9.0.3 предпочтительнее. Или я очень стараюсь перестроить стороннюю библиотеку.
Более того, я совершенно уверен, что на наших ПК для разработки, когда сторонняя библиотека запрашивает старый dll, она перенаправляется на новый dll - они двоично совместимы.
Заявочные манифесты и сборки предназначались для того, чтобы спасти нас всех от такого мусора. Должна быть возможность отредактировать файлы манифеста сборки, чтобы можно было загружать как exe, так и dll.
1 ответ
Я никогда не пробовал этого, но я думаю, что вы можете решить это с помощью bindingRedirect в манифесте, я знаю, что это работает в управляемом мире.
Смотрите пример (вам нужно изменить значения для вашей версии)
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<configuration>
<windows>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<assemblyIdentity name="Your.Application.Name" type="win32" version="9.0.0.0"/>
<dependentAssembly>
<assemblyIdentity type="win32" name="Microsoft.VC90.CRT" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b" />
<bindingRedirect oldVersion="9.0.20718.0-9.0.21022.8" newVersion="9.0.30411.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity type="win32" name="Microsoft.VC90.MFC" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b" />
<bindingRedirect oldVersion="9.0.20718.0-9.0.21022.8" newVersion="9.0.30411.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity type="win32" name="Microsoft.VC90.MFCLOC" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b">
</assemblyIdentity>
<bindingRedirect oldVersion="9.0.20718.0-9.0.21022.8" newVersion="9.0.30411.0"/>
</dependentAssembly>
</assemblyBinding>
</windows>
</configuration>