Могут ли разные версии DLL быть загружены в одном приложении? - PullRequest
6 голосов
/ 09 декабря 2010

Мое приложение использует одну версию библиотеки (a.dll), я использую другую DLL (b.dll), которая в свою очередь использует более старую версию той же библиотеки (a.dll), которую я использую. Я создаю приложение, встраивая файл манифеста. DLL, которую я использую, также использует встроенный файл манифеста. У меня обе версии библиотеки в моей папке WinSXS. Мое приложение не может загрузить соответствующие версии DLL.

Поможет ли наличие отдельного файла манифеста (без встраивания в DLL) решить проблему? Что обходится?

Ответы [ 2 ]

6 голосов
/ 09 декабря 2010

Ваша ситуация - это именно та ситуация, которую WinSxS должен решить.Должно работать.

Либо: файлы манифеста указывают на одну и ту же версию, либо один из файлов манифеста неправильно внедрен, либо

Общая сборка в WinSxS была установлена ​​сПолитика конфигурации, которая автоматически перенаправляет запросы от v1.0 до v1.1


Требуются некоторые пояснения: App.exe и b.dll неявно связаны с a.dll?Или они загружают его через LoadLibrary.

Если B.DLL загружает A.DLL явно, используя LoadLibrary, вам нужно добавить ISOLATION_AWARE_ENABLED в определения вашего препроцессора, чтобы гарантировать, что вызовы LoadLibrary, сделанные B.DLL, смотрят вправильный контекст активации.В противном случае они будут сделаны в контексте контекста активации по умолчанию, который был создан манифестом EXE-файла.

0 голосов
/ 09 декабря 2010

Это будет зависеть от того, что делают дублированные библиотеки DLL и совместимы ли их версии.(Например, имеют ли они оба доступ к общим объектам в памяти? Если так, есть большая вероятность, что что-то взорвется.)

Это также будет зависеть от того, как будут загружены эти две DLL с одинаковыми именами.Если это что-то отличное от явной LoadLibrary с полным путем, то, вероятно, ничего не получится.Здесь продолжается обсуждение этого вопроса: Определите загруженный путь для DLL

В общем, если вам повезет, это может сработать.Тот факт, что это может привести к катастрофическим ошибкам, является хорошей причиной, чтобы полностью избежать этой проблемы, если вы можете.(В худшем случае вы можете разместить один из модулей в другом процессе и проксировать все вызовы к нему. В идеале, просто иметь возможность использовать одну и ту же версию DLL в обоих модулях.)

...