C++. Базовый курс.
Приложение В: *.NET-расширения для C++
Разработанная компанией Microsoft интегрированная оболочка .NET Framework определяет среду, которая предназначена для поддержки разработки и выполнения сильно распределенных приложений, основанных на использовании компонентных объектов. Она позволяет "мирно сосуществовать" различным языкам программирования и обеспечивает безопасность, переносимость программ и общую модель программирования для платформы Windows. Несмотря на относительную новизну оболочки .NET Framework, по всей вероятности, в ближайшем будущем в этой среде будут работать многие С++-программисты.
Интегрированная оболочка .NET Framework предоставляет управляемую среду, которая следит за выполнением программы. Программа, предназначенная для помещения в оболочку .NET Framework, не компилируется с целью получения объектного кода. Вместо этого она переводится на промежуточный язык MSIL (Microsoft Intermediate Language), а затем выполняется под управлением универсального средства CLR (Common Language Runtime). Управляемое выполнение— это механизм, который поддерживает ключевые преимущества, предлагаемые оболочкой .NET Framework.
Чтобы воспользоваться преимуществами управляемого выполнения, необходимо применять для С++-программ специальный набор нестандартных ключевых слов и директив препроцессора, которые были определены разработчиками компании Microsoft. Важно понимать, что этот дополнительный набор не включен в стандарт C++ (ANSI/ISO Standard C++). Поэтому код, в котором используются эти ключевые слова, нельзя переносить в другие среды выполнения.
Описание оболочки .NET Framework и методов С++-программирования, необходимых для ее использования, выходит за рамки этой книги. Однако здесь приводится краткий обзор .NET-расширения языка C++ ради тех программистов, которые работают в .NET-среде.
Ключевые слова .NET-среды.
Для поддержки .NET-среды управляемого выполнения С++-программ Microsoft вводит в язык C++ следующие ключевые слова.

Краткое описание каждого из этих ключевых слов приведено в следующих разделах.
_ _abstract.
Ключевое слово _ _abstract используется в сочетании со словом _ _gc при определении абстрактного управляемого класса. Объект _ _abstract-класса создать нельзя. Для класса, определенного с использованием ключевого слова _ _abstract, необязательно включение в него чисто виртуальной функции.
_ _box.
Ключевое слов _ _box заключает в специальную оболочку значение внутри объекта. Такая "упаковка" позволяет использовать тип этого значения в коде, который требует, чтобы данный объект был выведен из класса System::Object, базового класса для всех .NET-объектов.
_ _delegate.
Ключевое слово _ _delegate определяет объект-делегат, который инкапсулирует указатель на функцию внутри управляемого класса (т.е. класса, модифицированного ключевым словом _ _gc).
_ _event.
Ключевое слово _ _event определяет функцию, которая представляет некоторое событие. Для такой функции задается только прототип.
_ _finally.
Ключевое слово _ _finally — это дополнение к стандартному С++-механизму обработки исключительных ситуаций. Оно используется для определения блока кода, который должен выполняться после выхода из блоков try/catch. При этом не имеет значения, какие условия приводят к завершению try/catch-блока. Блок _ _finally должен быть выполнен в любом случае.
_ _gc.
Ключевое слово _ _gc определяет управляемый класс. Обозначение "gc" представляет собой сокращение от словосочетания "garbage collection" (т.е. "сборка мусора") и означает, что объекты этого класса автоматически подвергаются процессу утилизации памяти, освобождаемой во время работы программы, когда они больше не нужны. В объекте отпадает необходимость в случае, когда на него не существует ни одной ссылки. Объекты _ _gc-класса должны создаваться с помощью оператора new. Массивы, указатели и интерфейсы также можно определять с использованием ключевого слова _ _gc.
_ _identifier.
Ключевое слово _ _identifier позволяет любому другому ключевому слову языка C++ использоваться в качестве идентификатора. Эта возможность не предназначена для широкого применения и введена для решения специальных задач.
_ _interface.
Ключевое слово _ _interface определяет класс, который должен действовать как интерфейс. В любом интерфейсе ни одна из функций не должна включать тело, т.е. все функции интерфейса являются неявно заданными чисто виртуальными функциями. Таким образом, интерфейс представляет собой абстрактный класс, в котором не реализована ни одна из его функций.
_ _nogc.
Ключевое слово _ _nogc определяет неуправляемый класс. Поскольку такой (неуправляемый) тип класса создается по умолчанию, ключевое слово _ _nogc используется редко.
_ _pin.
Ключевое слово _ _pin используется для определения указателя, который фиксирует местоположение в памяти объекта, на который он указывает. Таким образом, "закрепленный" объект не будет перемещаться в памяти в процессе сборки мусора. Как следствие, сборщик мусора не в состоянии сделать недействительным указатель, модифицированный с помощью ключевого слова _ _pin.
_ _property.
Ключевое слово _ _property определяет свойство, являющееся функцией-членом, которая позволяет установить или получить значение некоторой переменной (члена данных класса). Свойства предоставляют удобное средство управления доступом к закрытым (private) или защищенным (protected) данным.
_ _sealed.
Ключевое слово _ _sealed предохраняет модифицируемый им класс от наследования другими классами. Это ключевое слово можно также использовать для информирования о том, что виртуальная функция не может быть переопределена.
_ _try_cast.
С помощью ключевого слова _ _try_cast можно попытаться преобразовать тип выражения. Если предпринятая попытка окажется неудачной, будет сгенерировано исключение типа System::InvalidCastException.
_ _typeof.
Ключевое слово _ _typeof позволяет получить объект, который инкапсулирует информацию о данном типе. Этот объект представляет собой экземпляр класса System::Туре.
_ _value.
Ключевое слово _ _value определяет класс, который представляет собой обозначение типа. Любое обозначение типа содержит собственные значения. И этим тип _ _value отличается от типа _ _gc, который должен выделять память для объекта с помощью оператора new. Обозначения типа, не представляют интерес для "сборщика мусора".
Расширения препроцессора.
Для поддержки .NET-среды компания Microsoft определяет директиву препроцессора #using, которая используется для импортирования метаданных в программу. Метаданные содержат информацию о типе и членах класса в форме, которая не зависит от конкретного языка программирования. Таким образом, метаданные обеспечивают поддержку смешанного использования языков программирования. Все управляемые С++-программы должны импортировать библиотеку <mscorlib.dll>, которая содержит необходимые метаданные для оболочки .NET Framework.
Компания Microsoft определяет две pragma-инструкции (используемые с директивой препроцессора #pragma), которые имеют отношение к оболочке .NET Framework. Первая (managed) определяет управляемый код. Вторая (unmanaged) определяет неуправляемый (собственный, т.е. присущий данной среде) код. Эти инструкции могут быть использованы внутри программы для селективного создания управляемого и неуправляемого кода.
Атрибут attribute.
Компания Microsoft определяет атрибут attribute, который используется для объявления другого атрибута.
Компиляция управляемых С++-программ.
На момент написания этой книги единственный доступный компилятор, который мог обрабатывать программы, ориентированные на работу в среде .NET Framework, поставлялся компанией Microsoft (Visual Studio .NET). Чтобы скомпилировать управляемую программу, необходимо использовать команду /сlr, которая передаст вашу программу "в руки" универсального средства Common Language Runtime.