Автор вопроса: Павел | Web-сайт:www.vbnet.ru | ICQ: 326066673
На фоне работы над справочником по API у меня всплыла идейка..
На API меня совсем не тянет в виду его постепенного отмирания (по
заявлениям Microsoft, некоторые фишки в Longhorn будут доступны уже
только из Managed кода), а вот принять участие в написании
справочника по .NET Framework я бы не отказался. Понимаю, конечно, что
это очень широкое понятие, и если бы мы написали такой справочник, то
потом не угнались бы за исправлениями, т.к. новые версии FW клепают
через год! Но по крайней мере, можно взять отдельную часть, например,
Windows Forms или ADO .NET. И это было бы совсем не плохо!
Что вы об этом думаете, товарищи?
Обращаюсь к знатокам .NET - если код компилируется, то во что он компилируется и нельзя ли сразу распространять скомпилированный код? Это я к тому, что на машинном уровне взаимодействие приложение-FW по сути наверняка примерно то же самое, что и API, едва ли мелкомягкие придумали что-либо уж совсем революционное... Как скомпилированное FW приложение вызывает функции FW?
Хм. Сразу код компилируется компилатором языка (например, для vb это
vbc.exe) в промежуточный язык (Intermediate Language). При запуске
этого приложения в дело вступает JIT-компилятор (Just-In-Time). Он
этот IL переводит в чистый машинный код, который уже может
выполняться. Это происходит только при первом запуске программы, а
также, если изменилась конфигурация системы, например, какой-то
компонент был обновлен.
Такая программа все время опирается на CLR (Common Language Runtime) -
это что-то типа VB6-ного рантайма, но, естественно, в 1000 раз круче и
прицип его работы совсем другой. А .NET Framework - это набор классов,
которые и можно использовать в своей проге. Для справки - Стандартные
типы данных вроде Integer или String, а также формы, контролы - это
тоже классы и они тоже входят в состав .NEt Framework.
Собственно, сразу после компиляции в IL программу уже можно
распространять среди пользователей. А уже на машине пользователя на
конкретной конфигурации системы произойдет JIT-компиляция.
Принципы работы API и .NET Framework совершенно разные. API - это
неуправляемый код, а .NET Framework - как раз управляемый. Хотя на
данный момент .NET Framework в некоторой степени является оберткой для
АПИ.
Скомпилированные приложения взаимодайствуют с .NET Framework по
совершенно другому принципу - через CLR.
=====
managed code - Управляемый код
Код, который запускается под "contract of cooperation" в среде
выполнения. Управляемый код должен содержать метаданные, необходимые
среде выполнения для того, чтобы обеспечить работу сервисов, таких,
как управление памятью, межъязыковая интеграция, проверка доступа кода
и автоматическое управление жизненным циклом объектов. Весь код,
представленный в виде промежуточного языка, выполняется как
управляемый код.
unmanaged code - Неуправляемый код
Код, который создан без следования соглашениям и требованиям среды
выполнения. Неуправляемый код выполняется в среде CLR с минимальными
сервисами (например, для них отсутствует сборщик мусора, ограничены
возможности по отладке и т.д.)
=====
То есть, управляемый код взаимодействует _только_ с CLR и все
низкоуровневые операции выполняет CLR. Это обеспечивает стабильность
кода. А неуправляемый код все делает сам и нет никакой гарантии, что
какой-то программист не решит, например, полезть в чужую память и этим
завалит все приложение.
=====
common language runtime - Общеязыковая среда выполнения
Ядро выполнения управляемого кода. Среда выполнения поддерживает
управляемый код, обеспечивая его сервисами, такими как, межъязыковая
интеграция, безопасность доступа кода, управление жизненным циклом
объектов, отладка и профилирование.
=====
Все. Больше CLR не может ничего, да и не должен.
А то, что управляемый код может сделать, обеспечивается тем самым .NET
Framework - более 7 тысяч классов. Ну и компоненты сторонних
разработчиков.
Снова GotDotNet:
=====
metadata - метаданные
Информация, которая описывает каждый элемент, управляемый средой
выполнения: сборка, загружаемый файл, тип, метод и т.д. Включает
информацию, необходимую для отладки и сборки мусора, а также
определения классов, информацию о совместимости версий и другую
информацию, необходимую среде выполнения.
=====
Метаданные - это грубо говоря тот же манифест. В нем могут хранится
сведения об атрибутах объектов, хранятся сведения об используемых
версиях компонентов. В принципе, доступ к ним как-то и не нужен
разработчику - все это - головная боль для CLR и JIT.
Тут дело все в том, что эти типы хранятся в стеке, а вот как получить
туда доступ, в MS вроде пока не гооврят. Но вот сделать подобное даже
можно - на C# можно перегрузить стандартные операторы типа +/-, а это
уже просто огромные возможности.
To Artyom: Я так понимаю, сделать так, чтобы твои данные хранились в
стеке, можно только сделав структуру и никак иначе (это я недавно
Эплмана перечитывал ).
To Cyrax: Всё в .NET - классы. Все типы данных - тоже классы, они
унаследованы от класса Object и имеют ряд его методов/свойств, типа
Equals, GetType, ToString и т.д.
Я немного не это имел в виду - я имел в виду создание абсолютно новой
переменной, причем именно моим кодом должно определяться, в каком виде
в стеке это будет храниться, как, например, сделать число сверхбольшой
точнисти - 100, 200 чисел после запятой. Конечно, сразу придумать
применеие такому трудно, но вот если такая ситуация возникнет, то нам
ничего не остается, как ограничиться кучей ... Хотя, может, не
настолько эта куча хуже и медленнее стека...