Связывание сборки .NET. Как и почему (1.1, 2.0, GAC, файлы политик и многое другое ...) - PullRequest
4 голосов
/ 29 января 2009

Я работал над множеством очень «странных» проблем с некоторыми версиями DLL, файлами политики и элементами в GAC, и за всю свою жизнь я не смог найти надежного ответа относительно того, как / почему .NET Framework выбирает сборки, которые он делает, при привязке ссылок на проекты.

Прежде всего, чтобы немного рассказать о том, что у нас есть, у нас есть два DLL-файла библиотеки со следующей информацией

ApplicationAssembly.dll - .NET 1.1 code - .dll Version 01.01.00.1234
ApplicationAssembly.dll - .NET 1.1 code - .dll Version 01.01.00.1244
ApplicationAssembly.dll - .NET 2.0 code - .dll Version 02.00.00.1111

Каждая из этих сборок загружается в GAC, и каждая из версий 1.1 и 2.0 имеет файл политики, определяющий самую последнюю версию для загрузки.

У нас есть проект, который ссылается на версию файла ApplicationAssembly.dll версии 1.1.00.1234, однако проект был перемещен, и путь к подсказке больше не действителен. Тем не менее, ссылка не является мертвой, а показывает версию 02.00.00.1111, а не предполагаемую версию 1.1 сборки.

Как определяется этот процесс, и почему он сразу же перешел на платформу 2.0? Если мы укажем, что это ссылка «Конкретная версия», даже при неправильном пути подсказки будет найдена правильная DLL, но из-за будущего риска поломки мы не сможем оставить этот параметр включенным.

Полагаю, вопрос Почему это происходит? И как .NET определяет, куда идти для сборки?

1 Ответ

3 голосов
/ 29 января 2009

Правила Fusion (функция управляемой загрузки dll в .Net), используемая для определения местоположения dll, довольно обширны (из-за Gac / строгих имен / пользовательских загрузочных хуков, чтобы назвать лишь некоторые).

Официальные правила рассматриваются широкими мазками здесь Поскольку ваша библиотека имеет строгое имя, к ней будут применяться более сложные правила

...