Общеязыковая среда исполнения
Общеязыковая среда исполнения (CLR) играет ключевую роль во всей технологии. Она поддерживает строгую систему правил и соглашений, которым должен следовать промежуточный язык. Этот язык представляет собой код, который называется управляемым. Важнейшим свойством CLR является то обстоятельство, что входной поток данных может представлять собой и неуправляемый код, а также управляемый и неуправляемый одновременно! Неуправляемые участки входных данных являются обычными машинными инструкциями, которые без изменений поступают в процессор. Указателем на то, что входной поток содержит управляемый код, является специальный бит в заголовке файла.
Управляемый код в общем случае порождает объекты с управляемым временем жизни. Такие объекты автоматически уничтожаются, когда надобность в них исчезает (например, завершает работу создавшая их программа). Таким образом, одной их замечательных способностей CLR является встроенная в нее борьба с утечкой памяти3.
Для создания объектов с управляемым временем жизни в управляемый код помещаются также метаданные, которые содержат подробные инструкции о порождаемых объектах, их свойствах, методах и событиях. Управляемый код перед запуском должен пройти процесс верификации (если только администратор не разрешил его пропустить). Процесс верификации определяет, будет ли код пытаться получить доступ к неправильным адресам памяти или производить другие неверные действия. Код, удовлетворяющий верификации, называется надежным (safe). Возможность верификации позволяет CLR обеспечивать высокий уровень изолированности объектов при минимальном снижении производительности. CLR использует метаданные, чтобы найти и загрузить классы, поместить их экземпляры в память, разрешить вызов программ, генерировать машинные инструкции, усиливать безопасность и устанавливать динамические контекстные границы.
CLR облегчает разработку компонентов и программ, объекты которых взаимодействуют с помощью языка. Объекты, написанные на разных языках, могут взаимодействовать друг с другом, и их поведение может быть тесно связанным. Например, вы можете определить класс и его потомка на разных языках или вызвать метод класса, написанного на другом языке. Межъязыковое взаимодействие возможно потому, что языковые компиляторы и инструменты целевой машины используют общую систему типов, определенную в CLI, и они следуют общим правилам для определения новых типов, а также их создания, использования, снабжения данными и связывания типов.