Вопрос

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

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

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

var loadedAssem = Assembly.Load(assem);

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

Я запустил этот код, и по первым запросам я предполагаю, что он загрузил бы сборку в ОЗУ (или приложение времени выполнения HTTP?), И тогда я могу создать экземпляры того, что там есть.

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

Будет ли все еще существовать в RAM? Если да, то как это различается между двумя сборками? Или это перезаписывает ранее объявленные занятия?

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

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

Решение

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


Относительно экземпляра:

  • Если вы используете Assembly.CreateInstance (как показано в вашем посте), это создаст его из экземпляра сборки, который вы использовали для вызова.
  • Если вы используете Activator.createInstance, который принимает строку, вам необходимо указать имя сборки. Поскольку в этом случае обе загруженные сборки будут иметь одинаковое имя, он будет использовать правила разрешения сборки, которые, я думаю, по умолчанию будут отдавать предпочтение первому совпадению (так что сборка, которую вы загрузили в первую очередь.) Я не уверен в этом. Вы можете зацепить Appdomain.assemblysolve Событие, чтобы обеспечить собственную приоритету и сделать ее наиболее загруженной сборкой.
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top