Поделиться через


Использование CodeDOM

CodeDOM содержит типы, представляющие многие общие типы элементов исходного кода. Вы можете разработать программу, которая будет строить модель исходного кода, используя элементы CodeDOM для создания графа объектов. Этот граф объектов может быть воспроизведен в виде исходного кода с помощью генератора кода CodeDOM для поддерживаемого языка программирования. CodeDOM можно также использовать для компиляции исходного кода в двоичную сборку.

Ниже приведены некоторые примеры применения CodeDOM.

  • Формирование кода по шаблонам: формирование кода для ASP.NET, клиентских прокси для веб-служб XML, мастеров кода, конструкторов или других механизмов порождения кода.
  • Динамическая компиляция: поддержка компиляции кода на одном языке или нескольких языках программирования.

Создание графа CodeDOM

Пространство имен System.CodeDom предоставляет классы для представления логической структуры исходного кода, независимой от синтаксиса языка.

Структура графа CodeDOM

Структура графа CodeDOM представляет собой дерево контейнеров. Самым верхним (корневым) контейнером каждого графа CodeDOM, доступного для компиляции, является CodeCompileUnit. Каждый элемент модели исходного кода должен быть связан с графом посредством свойства CodeObject в графе.

Создание модели исходного кода для примера программы Hello World

Ниже приведено пошаговое руководство по построению графа объектов CodeDOM, представляющего код для простого приложения "Hello, World". Полный исходный код для этого примера кода см. в System.CodeDom.Compiler.CodeDomProvider статье.

Создание единицы компиляции

CodeDOM определяет объект с именем CodeCompileUnit, который может ссылаться на граф объектов CodeDOM, моделирующий компилируемый исходный код. В свойствах объекта CodeCompileUnit могут храниться ссылки на атрибуты, пространства имен и сборки.

Поставщики CodeDom, производные от класса CodeDomProvider, содержат методы, которые обрабатывают граф объектов, на который ссылается CodeCompileUnit.

Чтобы создать граф объектов для простого приложения, необходимо собрать модель исходного кода и сослаться на нее из CodeCompileUnit.

В следующем примере приведен синтаксис для создания модуля компиляции.

CodeCompileUnit^ compileUnit = gcnew CodeCompileUnit();
CodeCompileUnit compileUnit = new CodeCompileUnit();
Dim compileUnit As New CodeCompileUnit()

Может CodeSnippetCompileUnit содержать раздел исходного кода, который уже находится на целевом языке, но не может быть отображен на другом языке.

Определение пространства имен

Чтобы определить пространство имен, необходимо создать объект CodeNamespace, а затем присвоить ему имя, используя подходящий конструктор или установив значение свойства Name.

CodeNamespace^ samples = gcnew CodeNamespace("Samples");
CodeNamespace samples = new CodeNamespace("Samples");
Dim samples As New CodeNamespace("Samples")

Импорт пространства имен

Чтобы добавить в пространство имен директиву импорта пространства имен, добавьте CodeNamespaceImport, который указывает пространство имен, которое следует импортировать в коллекцию CodeNamespace.Imports.

В следующем фрагменте кода пространство имен System импортируется в коллекцию Imports объекта CodeNamespace с именем samples:

samples->Imports->Add(gcnew CodeNamespaceImport("System"));
samples.Imports.Add(new CodeNamespaceImport("System"));
samples.Imports.Add(new CodeNamespaceImport("System"))

Все элементы кода, образующие граф CodeDOM, должны быть связаны с объектом CodeCompileUnit, являющимся корневым элементом дерева, последовательностью ссылок между элементами, на которые имеются прямые ссылки из свойств корневого объекта графа. Чтобы задать ссылку из объекта-контейнера, необходимо присвоить объект свойству объекта-контейнера.

Приведенный ниже оператор добавляет samples CodeNamespace в свойство коллекции Namespaces корневого объекта CodeCompileUnit.

compileUnit->Namespaces->Add( samples );
compileUnit.Namespaces.Add( samples );
compileUnit.Namespaces.Add(samples)

Определение типа

Чтобы объявить класс, структуру, интерфейс или перечисление с помощью CodeDOM, создайте объявление CodeTypeDeclaration и присвойте ему имя. В приведенном ниже примере демонстрируется использование перегрузки конструктора для задания значения свойства Name.

CodeTypeDeclaration^ class1 = gcnew CodeTypeDeclaration("Class1");
CodeTypeDeclaration class1 = new CodeTypeDeclaration("Class1");
Dim class1 As New CodeTypeDeclaration("Class1")

Чтобы добавить тип в пространство имен, добавьте объект CodeTypeDeclaration, представляющий тип, который следует добавить в коллекцию Types пространства имен CodeNamespace.

В следующем примере демонстрируется добавление класса class1 в пространство имен CodeNamespace с именем samples:

samples->Types->Add(class1);
samples.Types.Add(class1);
samples.Types.Add(class1)

Добавление членов класса в класс

Пространство имен System.CodeDom предоставляет различные элементы, которые можно использовать для представления членов класса. Каждый элемент класса может быть добавлен в коллекцию Members объекта CodeTypeDeclaration.

Определение метода точки входа кода для исполняемого файла

В случае сборки кода исполняемой программы необходимо указать точку входа в программу, создав объект CodeEntryPointMethod для представления метода, с которого должно начинаться выполнение программы.

В следующем примере показано, как определить метод точки входа, который содержит объект CodeMethodInvokeExpression, вызывающий System.Console.WriteLine для вывода текста "Hello World!":

CodeEntryPointMethod^ start = gcnew CodeEntryPointMethod();
CodeMethodInvokeExpression^ cs1 = gcnew CodeMethodInvokeExpression(
    gcnew CodeTypeReferenceExpression("System.Console"),
    "WriteLine", gcnew CodePrimitiveExpression("Hello World!"));
start->Statements->Add(cs1);
CodeEntryPointMethod start = new CodeEntryPointMethod();
CodeMethodInvokeExpression cs1 = new CodeMethodInvokeExpression(
    new CodeTypeReferenceExpression("System.Console"),
    "WriteLine", new CodePrimitiveExpression("Hello World!"));
start.Statements.Add(cs1);
Dim start As New CodeEntryPointMethod()
Dim cs1 As New CodeMethodInvokeExpression( _
    New CodeTypeReferenceExpression("System.Console"), _
    "WriteLine", new CodePrimitiveExpression("Hello World!"))
start.Statements.Add(cs1)

Приведенный ниже оператор добавляет метод точки входа Start в коллекцию Members класса class1.

class1->Members->Add(start);
class1.Members.Add( start );
class1.Members.Add(start)

Теперь объект CodeCompileUnit с именем compileUnit содержит граф CodeDOM для простой программы "Hello World". Сведения о создании и компиляции кода на основе графа CodeDOM см. в разделе Создание исходного кода и компиляция программы из графа CodeDOM.

Дополнительные сведения о построении графа CodeDOM

CodeDOM поддерживает многие общие типы элементов кода, которые встречаются в языках программирования, поддерживающих среду CLR. Но CodeDOM не предусматривает предоставление элементов для представления всех возможных функций языков программирования. Код, который не может быть без труда представлен элементами CodeDOM, можно инкапсулировать в объекты CodeSnippetExpression, CodeSnippetStatement, CodeSnippetTypeMember или CodeSnippetCompileUnit. Но фрагменты кода невозможно автоматически переводить с помощью CodeDOM на другие языки.

Сведения о каждом типе CodeDOM см. в справочной документации по пространству имен System.CodeDom.

Быстро найти элемент CodeDOM, представляющий определенный тип элемента кода, можно в разделе Краткий справочник по CodeDOM.