Как работает Assembly.Load (byte [])? - PullRequest
3 голосов
/ 30 ноября 2011

Мне было просто интересно, что произойдет, если в веб-приложении дважды загрузить одни и те же байты сборки.

Например, у меня есть этот код

byte[] assem = System.IO.File.ReadAllBytes(appRoot + "/Plugins/Plugin.dll");

var loadedAssem = Assembly.Load(assem);

var plugin = loadedAssem.CreateInstance("Plugin.ThePlugin") as IPlugin;

Я запустил этот код и при первом запросе я предполагаю, что он загрузит сборку в ram (или в домен приложения времени выполнения http?), А затем я смогу создать экземпляры всего, что там есть.

Если бы я снова запустил этот код, скажите во втором запросе, что произойдет со сборкой при первом запросе?

Будет ли все еще существовать в ОЗУ? если да, то как он различает две сборки? или он перезаписывает ранее объявленные классы?

Это для моего понимания, как и в PHP, это не просто случай "require_once".

1 Ответ

7 голосов
/ 30 ноября 2011

Это загрузит две отдельные копии сборки, каждую из которых можно использовать из вашего приложения. Типы в каждой сборке являются различными типами и не будут взаимодействовать друг с другом. Например, если вы возьмете виджет из Copy1 и попытаетесь передать его методу, который берет виджет в Copy2, это вызовет сбой во время выполнения. Невозможно выгрузить сборки после того, как они были загружены таким образом (то есть в ваш основной домен приложений).


Относительно реализации:

  • Если вы используете Assembly.CreateInstance (как показано в вашем сообщении), он будет создан из экземпляра Assembly, который вы использовали для выполнения вызова.
  • Если вы используете Activator.CreateInstance, который принимает строку, вам нужно указать имя сборки. Поскольку в этом случае обе загруженные сборки будут иметь одинаковые имена, будут использоваться правила разрешения сборок, которые, я думаю, по умолчанию будут благоприятствовать первому совпадению (поэтому сборка, которую вы загрузили первой). Я не уверен в этом. Вы можете перехватить событие AppDomain.AssemblyResolve , чтобы задать собственные приоритеты и использовать его для последней загруженной сборки.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...