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

Проще говоря, предположим, что нет никаких 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, это сработало бы или выдало ошибку? Меняются ли эти правила в зависимости от того, изменяется ли основная / вспомогательная / сборочная / ревизионная часть?

Чем это отличается, если для ссылки на проект "Конкретная версия" задано значение "Истина" или "Ложь"?

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

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

1 ответ

Решение

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

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

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

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

Другие вопросы по тегам