SidBySide: Сторонняя Dll относится к двум версиям MSVCR80.DLL.

Мы включаем стороннюю библиотеку + DLL, которая в последнее время вызывает много проблем при установке. Используя dependencywalker, мы обнаружили, что сама dll относится к двум различным версиям

MSVCR80.DLL:
Version 8.0.50727.4053 and
Version 8.0.50727.42

альтернативный текст http://img101.imageshack.us/img101/1734/dependencywalk2.jpg < / а>

В большинстве случаев установка не вызывает проблем, даже если мы не распространяем ни одну из обеих версий. Но в ряде случаев наша установка просто не запускается. Затем мы находим сообщения в журнале системных событий Windows от менеджера SideBySide: «Версия DLL не совпадает». В большинстве случаев эту проблему снова можно решить, установив .NET framework (хотя мы этим не пользуемся). Но теперь у нас есть случай, когда это не помогает.

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

Можно как-то использовать только одну версию Dll?

РЕДАКТИРОВАТЬ: Теперь я попробовал совет христианина:

D:\Develop\LEADTOOLS15\patch_maifest>mt.exe -inputresource:ltkrn15u.dll;#1 -out:old.manifest
Microsoft (R) Manifest Tool version 5.2.3790.2075
Copyright (c) Microsoft Corporation 2005.
All rights reserved.

mt.exe : general error c101008c: Failed to read the manifest from the resource of file "ltkrn15u.dll". Ressource not found.

Если я просматриваю зависимости dll с полными путями, я вижу следующее: http://img340.imageshack.us/img340/4122/dependencywalk3.jpg

Нижний MSVCR80.DLL - это версия с версией ... 42. Я этого не понимаю. Почему MSVC P 80.DLL относится к другой версии MSVC R 80.DLL, чем та, которая стоит за ней? Может быть, это проблема зависимого пользователя?


person RED SOFT ADAIR    schedule 13.10.2009    source источник
comment
Я бы действительно обратился к стороннему производителю библиотек и попросил их использовать только одну из версий!   -  person stijn    schedule 13.10.2009


Ответы (2)


Лучше всего отправить необходимые библиотеки DLL в пакет установщика приложений. Используйте хотя бы версию, от которой зависит ваша сторонняя DLL.

Microsoft предлагает автономные установщики для своих динамических библиотек DLL (vcredits_ *). Последнюю версию VisualStudio 2005 можно загрузить здесь. Это также версия, с которой связана ваша DLL. Вы можете автоматически запустить распространяемый пакет из установщика.

В качестве обходного пути для уже установленных систем просто примените программу установки redist на целевой машине.

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

Чтобы лучше понять, прочтите эти статьи MSDN < / а>.

person Frank Bollack    schedule 13.10.2009
comment
Я установил распространяемый файл Visual Studio 2005. Это действительно решило проблему. Интересно, что бесполезно просто копировать каталог сборки в наш каталог \ bin (содержащий все DLL и EXE), как мы пробовали раньше. - person RED SOFT ADAIR; 13.10.2009
comment
vcredist - лучший вариант. Я видел один случай, когда не удалось установить пакет vcredist. Понятия не имею, почему это не сработало, мне пришлось вручную распаковать файл vcredist.exe и скопировать файлы рядом с нашим исполняемым файлом. - person Cristian Adam; 13.10.2009
comment
Но почему копирование файлов рядом с моим исполняемым файлом НЕ работает, тогда как после установки vcredist устраняет проблему? - person RED SOFT ADAIR; 13.10.2009
comment
В моем случае у меня была только одна версия CRT в качестве зависимости. С несколькими версиями все усложняется. - person Cristian Adam; 13.10.2009

Вы должны изменить / обновить ресурс манифеста из dll.

mt.exe -inputresource:dll_with_manifest.dll;#1 -out:old.manifest
mt.exe -manifest new.manifest -outputresource:dll_with_manfiest.dll;#1

Иногда тип ресурса RT_MANIFEST (тип 24) не имеет индекса №1 в таблице ресурсов, вам следует использовать средство просмотра ресурсов (ResourceHacker или ResEdit) и узнайте номер индекса. Я видел случаи, когда манифест имел порядковый номер # 2.

person Cristian Adam    schedule 13.10.2009
comment
Пробовал - в dll вроде манифеста нет. Пожалуйста, смотрите правки в моем сообщении. - person RED SOFT ADAIR; 13.10.2009