Как уже говорилось в разделе "Microsoft Intermediate Language и компиляторы JITter", CLS-совместимые компиляторы создают из вашего исходного кода MSIL-код, подлежащий компиляции (с помощью ЛТ-ком-пиляторов) перед своим выполнением. Помимо перевода исходного кода в MSIL-последовательность, CLS-совместимые компиляторы выполняют и другую столь же важную задачу: внедрение метаданных в выходной ЕХЕ-файл.
Метаданные
(metadata) — это данные описывающие другие данные. В нашем контексте — это набор программных элементов ЕХЕ-файла, таких как типы и реализации методов. Не правда ли, звучит знакомо? Эти метаданные похожи на библиотеки типов (typelib), генерируемые компонентами Component Object Model (COM). Метаданные, порождаемые .NET-компилятором, как правило, не только намного выразительнее и полнее, чем библиотеки типов СОМ, к которым мы успели привыкнуть. Метаданные также всегда внедрены в ЕХЕ-файл. Благодаря этому исключены случайные потери метаданных приложения и рассогласование файлов.
Причина использования метаданных очевидна. Благодаря этой технологии CLR узнает, какие во время выполнения потребуются типы и какие методы должны быть вызваны. Это дает среде возможность выполнить должную настройку для более эффективного выполнения приложения. Механизм запроса метаданных называется
отражением
(reflection). Библиотеки классов .NET Framework имеют целый набор методов отражения, позволяющих любому приложению (и не только CLR) запросить метаданные другого приложения.
Такие инструменты, как Visual Studio.NET, используют методы отражения для реализации средств подобных IntelliSense. При наличии Inte-lliSense вы, набирая имя метода, видите на экране всплывающий список с аргументами этого метода. Visual Studio.NET дополняет это средство, показывая еще и все члены типа. Об API отражения см. главу 15.
Еще один чрезвычайно полезный .NET-инструмент, использующий преимущество отражения, — Microsoft .NET Framework IL Disassembler (ILDASM). Эта мощная утилита выполняет синтаксический разбор метаданных выбранного приложения, а затем отображает информацию о нем в виде дерева. Вот как выглядит приложение "Hello, World" на С# в ILDASM (рис. 2-1):