Почему MSDN говорит, что сборка редко загружается по пути?

Согласно документации для System.Assembly:

LoadFile и LoadFrom предназначены для редких сценариев, в которых необходимо определяется по пути.

Они предлагают чаще загружать сборку по ее отображаемому имени (например, «System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089»).

Это не имеет для меня никакого смысла. Если вы хотите сослаться на сборку по ее версии и открытому ключу, вы должны добавить ссылку во время компиляции; вы не будете загружать его во время выполнения, используя класс Assembly. Типичный сценарий загрузки сборки во время выполнения — это когда вы загружаете подключаемый модуль, что будет выполняться по пути, поскольку вы либо сканируете каталог на наличие подключаемых модулей, либо читаете какой-то манифест, в котором указано, где они находятся.

Почему в документах говорится, что среди сценариев, в которых вы динамически загружаете сборку, загрузка по пути является «редкой»? Насколько я могу судить, он загружает его по отображаемому имени, что бывает редко.


person Joe White    schedule 05.07.2010    source источник


Ответы (3)


Ну, это должно быть редко, так как это так хлопотно. Но да, плагины, как правило, загружаются с помощью LoadFrom(). Никогда с помощью LoadFile(), это вызовет настоящие проблемы.

Проблема в том, что вы не можете точно предсказать, что произойдет со сборками, от которых зависит подключаемый модуль. Получение этих разрешений должным образом является дерьмом. Решение, которое вы должны предпочесть, — это файл .config, чтобы вы могли использовать Load(), а пути зондирования были предсказуемы.

person Hans Passant    schedule 05.07.2010

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

http://msdn.microsoft.com/en-us/library/yx7xezcf%28VS.71%29.aspx

person E.J. Brennan    schedule 05.07.2010
comment
Да, но когда это будет иметь смысл? При каких обстоятельствах я стал бы писать код загрузки во время выполнения, который загружается по отображаемому имени? Уж точно не для плагинов и не для зависимостей. - person Joe White; 05.07.2010

Я загрузил «плагины» по отображаемому имени. Почему? Верите вы или нет, сборкам вообще не нужно жить на диске (или, по крайней мере, не так, чтобы у вас был прямой путь к ним). Это может быть невероятно полезно.

Кроме того, «необязательные» сборки, такие как сборки сериализации, обычно имеют Assembly.Loaded по имени.

person Logan Capaldo    schedule 05.07.2010
comment
Интересный. Как ты это делаешь? Вы меня заинтересовали. - person Joe White; 05.07.2010
comment
Существует по крайней мере 2 способа: событие AppDomain.AssemblyResolve, которое может использовать перегрузку Assembly.Load(byte[]) для разрешения сборки из другого места, и реализация наивного интерфейса размещения IHostAssemblyStore для пользовательского узла. - person Logan Capaldo; 05.07.2010