| Компонентность .NET шита белыми нитками | |
| От: | Сергей Губанов | ||
| Дата: | 02.12.04 08:12 | ||
| Оценка: | +1 -8 ![]() | ||
| Никогда раньше не работал с .NET, но слышал что она является компонентной/модульной. Вчера решил проверить так ли это на самом деле. Основным принципом модульной расширяемой системы является то, что она состоит из динамически {загружаемых, выгружаемых, линкуемых} модулей, причем каждый модуль может быть загружен и слинкован с остальными модулями, естественно, только один раз (зачем в модульной системе загружать и линковать 2 экземпляра одного и того же модуля???); а также то что она обладает одним единственным сборщиком мусора на всю систему. Например, модуль M1:
будучи один раз загруженным в память предоставляет переменную M1.X (в одном единственном экземпляре) всем остальным модулям всей модульной расширяемой операционной системы. В .NET это не так! Каждый якобы модуль системы .NET (будем писать его в кавычках: "модуль"), оказывается вовсе не является модулем всей системы .NET. А он является модулем лишь каждого конкретного приложения которое его импортировало. Сколько приложений импортировало этот "модуль" столько экземпляров его и будет создано. Вот пример: Исходный код "модуля" M1.dll:
Исходный код "модуля" A1.exe:
Исходный код "модуля" A2.exe:
Скомпилировал M1.dll, A1.exe, A2.exe и положил их троих в один и тот же каталог. Запустил A1.exe и A2.exe, каждый из них вывел один и тот же ответ M1.Var.X = 1. То есть каждый из "модулей" A1 и A2 работает со своим экземпляром "модуля" M1, а вовсе не с одним единственным как это должно быть в модульной расширяемой системе. Выводы 1) Сама .NET не является модульной системой. Модульной системой является каждое конкретное .NET приложение, в рамках которого модули загружены/слинкованы в единственном экземпляре. 2) Вот вам и объяснение того почему минимальные .NET приложения типа "Здравствуй Мир!" используют так много памяти (3.8 мегабайтов для минимального консольного и 8 мегабайтов для минимального оконного) — они просто содержат в себе копии всех системных/библиотечных модулей, чего не было бы если бы сама .NET была модульной! А что если системные/библиотечные модули будут требовать не 4-8 мегабайтов, а 100-200 мегабайтов? Расширяемой модульной системе это безразлично, так как она каждый модуль загружает лишь однажды, а .NET создаст их столько раз сколько приложений их использует! 3) Раз так, то, думается, что и сборщик мусора присутсвует в .NET не в единственном экземпляре (как это должно быть в модульной расширяемой системе), а опять же, во множественном. 11.12.04 02:01: Перенесено из 'Философия программирования' |