В чем недостатки вызова Assembly.Load (AssemblyName) с одной и той же сборкой несколько раз? - PullRequest
4 голосов
/ 03 июня 2011

Мне любопытно узнать, в чем заключается недостаток, многократно вызывая Assembly.Load(AssemblyName) с одной и той же версией сборки. Знает ли среда выполнения, чтобы не загружать сборку снова после первого вызова? Если нет, есть ли способ определить, что уже загружено?

Спасибо заранее.

1 Ответ

10 голосов
/ 03 июня 2011

Когда вы используете эту перегрузку, она будет загружена в память только один раз. Вы можете проверить это с помощью Process Explorer. Посмотрите на список загруженных модулей. Каждая сборка загружается до .NET 3.5 с LoadLibrary. Кроме того, он загружается в файл как отображенный в памяти процесс.

Начиная с .NET 4.0, сборка загружается только в виде файла с отображенной памятью, а не через LoadLibrary, за исключением случаев, когда это предварительно скомпилированная сборочная версия.

Это серьезное изменение в .NET 4 было сделано из-за того, что MS обнаружила во время разработки VS 2010, что их память истощалась довольно быстро. Кто-то обнаружил, что каждая загруженная сборка занимала в виртуальной памяти в два раза больше своего первоначального размера, потому что она была загружена один раз через LoadLibrary и второй раз как файл отображения памяти. Это нелегко найти, кроме случаев, когда вы изучаете VMMap в своем процессе. Из-за огромного количества кода в VS это было основной проблемой для VS2010, который сейчас в основном управляется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...