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>
Другие вопросы по тегам