Представим, что есть некоторая библиотека классов .dll написанная на C#, в которой есть 100500 классов и столько же методов/полей в каждом и весит она вообще космические цифры. Представим, что есть вторая программа - консольное приложение C#, которое хочет использовать эту dll. dll подключается в проект просто через ссылку. Дальше представим, что в этом приложении есть следующий код:
TestClass a = new TestClass();
Console.WriteLine(a.add(10, 10));
Console.WriteLine(a.sub(20, 15));
Где TestClass - класс из dll.
Вопрос: как произойдет импорт из длл? При запуске процесса он возьмет и загрузит всю эту огромную библиотеку мне в процесс? Или же будет подгружать только используемые мной классы? Или же вообще будет подгружать только нужные методы?
Ответ
DLL из .NET может содержать несколько видов данных, в частности байт код (IL), метаданные, описывающие типы, метаданные, описывающие сборку и просто какие-то ресурсы, например, иконки.
При использовании библиотеки из неё будут загружены метаданные и байт код. С процессами в CLR всё несколько сложнее, чем в обычном Windows, поскольку там используется концепция управляемого кода, поэтому DLL загружаются не в ваш процесс, а в процесс приложения-хоста.
Но в целях упрощения можно считать, что да, в ваш процесс будет загружен весь код из DLL. По поводу его огромности есть сомнения — сейчас посмотрел наш проект, в котором 55 сборок, средний размер сборки 240 килобайт. Для современных компьютеров, где 4-8Гб ОЗУ сейчас уже вполне норма на обычных офисных машинах это копейки.
Если же вы видите действительно огромную DLL, которая «весит» 10 мегабайт, то скорее всего, в ней находится не только код, но и ресурсы, и они занимают большую часть файла. Вы можете проверить это предположение с помощью программы ILDASM, которая входит в состав .NET и позволяет посмотреть, из чего состоит сборка.
Ресурсы подгружаются только по мере надобности, хотя Windows в условиях избытка памяти может загрузить и всё сразу.
Комментариев нет:
Отправить комментарий