2009-07-02 2 views
2

У меня есть проект, который содержит модули Dll до сборки, построенный некоторое время в прошлом, используя Visual Studio 9.Howto: Несколько версий msvcrt9 как частные сборки SxS?

Исполняемый файл проекта строится сейчас, используя SP1 для Visual Studio 9.

Когда мы развертываем EXE, мы не хотим требовать административного доступа, поэтому C-Runtime была включена в корень приложения. 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 - получить 9.0.2 DLL с исходного исходного носителя. Это нежелательно, поскольку 9.0.3 является предпочтительным. Или я очень стараюсь получить перестройку сторонней библиотеки.

Кроме того, я уверен, что на наших компьютерах разработки, когда сторонняя библиотека запрашивает старую dll, она перенаправляется на новую dll - они совместимы с двоичными файлами.

Заявительные манифестации и ассамблеи призваны спасти всех нас от этого вида мусора. Должно быть возможно отредактировать файлы манифеста сборки, чтобы загрузить как exe, так и dll.

ответ

2

Я никогда не пробовал это, но я думаю, что вы можете решить это с помощью 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> 
+0

Это очень близко к тому, что ив пытался. Где и как я могу разместить этот XML? Мое приложение имеет встроенный. Манифестный файл, в документации говорится, что bindingRedirections следует поместить в файл app.exe.config. Я создал файл конфигурации, поместил его в папку приложения и не вижу никакой разницы. im не уверен, что он даже используется. Возможно, мне нужно обеспечить, чтобы assemblyIdentity полностью соответствовал моим приложениям manifestItentiy. –

+0

Он должен быть внутри манифеста, вы можете добавить свое собственное объявление в манифест, сгенерированный VS, у меня нет VS здесь, поэтому я не могу дать вам точный метод, но он где-то под настройками проекта \ manfirst tool –

+2

Просто некоторые пояснения: Если EXE имеет зависимую сборку, которую необходимо перенаправить, соответствующее имя для файла локальной политики: application.exe.config. Если это спутниковая dll, которая имеет зависимую сборку, которая нуждается в перенаправлении, файл политики называется dllname.dll.2.config - Почему .2? Я не знаю. Но он должен быть там. –

Смежные вопросы