Как загрузчик сборки fusion решает, какую версию DLL загружать

StackOverflow https://stackoverflow.com//questions/25034831

Вопрос

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

Как fusion решает, какую версию DLL-файлов в GAC использовать (при прочих равных условиях), каков порядок приоритета?

Например, если в моем проекте я ссылался на библиотеку DLL версии 10.5.0.0.Будет ли он выбирать DLL версии 10.5.0.0 или 10.5.1.0.В качестве альтернативы, если бы у меня была только версия 10.4.0.0 в GAC, сработала бы она или выдала ошибку?Меняются ли эти правила в зависимости от того, изменяется ли основная / второстепенная часть / сборка / ревизия?

Как это отличается, если для ссылки на проект "Конкретная версия" установлено значение True или False?

И чем это отличается, если ссылка является ссылкой на DLL или ссылку на проект?

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

Это было полезно?

Решение

Это задокументировано в MSDN в Как среда выполнения Находит Сборки.В частности, поиск в GAC выполняется только в том случае, если сборка загружена с использованием строгого имени.Все еще могут существовать политики издателя, которые "перенаправляют" на другую сборку, но автоматических правил не существует.

На мой взгляд, GAC - это только то, что должно использоваться Microsoft для .NET Framework, и вы можете устранить много проблем, распространяя свое приложение или библиотеку без использования GAC (за исключением .NET Framework, конечно).

Ссылка на определенную версию сборки является свойством времени сборки и не влияет на поведение во время выполнения.Однако, когда ссылка на сборку компилируется в исполняемый файл, версия сохраняется в исполняемом файле и во время выполнения загружается эта конкретная версия (после применения правил перенаправления сборки).

Итак, подведем итог:Для того чтобы .NET мог загрузить другую версию запрошенной сборки, должно быть установлено перенаправление сборки.Ваше приложение может предоставлять перенаправления в файле app.config, а GAC может иметь политики издателя.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top