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

CodeDOM содержит типы, представляющие многие общие типы элементов исходного кода.The CodeDOM provides types that represent many common types of source code elements. Вы можете разработать программу, которая будет строить модель исходного кода, используя элементы CodeDOM для создания графа объектов.You can design a program that builds a source code model using CodeDOM elements to assemble an object graph. Этот граф объектов может быть воспроизведен в виде исходного кода с помощью генератора кода CodeDOM для поддерживаемого языка программирования.This object graph can be rendered as source code using a CodeDOM code generator for a supported programming language. CodeDOM можно также использовать для компиляции исходного кода в двоичную сборку.The CodeDOM can also be used to compile source code into a binary assembly.

Ниже приведены некоторые примеры применения CodeDOM.Some common uses for the CodeDOM include:

  • Формирование кода по шаблонам: формирование кода для ASP.NET, клиентских прокси для веб-служб XML, мастеров кода, конструкторов или других механизмов порождения кода.Templated code generation: generating code for ASP.NET, XML Web services client proxies, code wizards, designers, or other code-emitting mechanisms.

  • Динамическая компиляция: поддержка компиляции кода на одном языке или нескольких языках программирования.Dynamic compilation: supporting code compilation in single or multiple languages.

Построение графа CodeDOMBuilding a CodeDOM Graph

Пространство имен System.CodeDom предоставляет классы для представления логической структуры исходного кода, независимой от синтаксиса языка.The System.CodeDom namespace provides classes for representing the logical structure of source code, independent of language syntax.

Структура графа CodeDOMThe Structure of a CodeDOM Graph

Структура графа CodeDOM представляет собой дерево контейнеров.The structure of a CodeDOM graph is like a tree of containers. Самым верхним (корневым) контейнером каждого графа CodeDOM, доступного для компиляции, является CodeCompileUnit.The top-most, or root, container of each compilable CodeDOM graph is a CodeCompileUnit. Каждый элемент модели исходного кода должен быть связан с графом посредством свойства CodeObject в графе.Every element of your source code model must be linked into the graph through a property of a CodeObject in the graph.

Построение модели исходного кода для образца программы "Hello, World"Building a Source Code Model for a Sample Hello World Program

Ниже приведено пошаговое руководство по построению графа объектов CodeDOM, представляющего код для простого приложения "Hello, World".The following walkthrough provides an example of how to build a CodeDOM object graph that represents the code for a simple Hello World application. Полный исходный код для этого примера см. в разделе System.CodeDom.Compiler.CodeDomProvider.For the complete source code for this code example, see the System.CodeDom.Compiler.CodeDomProvider topic.

Создание модуля компиляцииCreating a compile unit

CodeDOM определяет объект с именем CodeCompileUnit, который может ссылаться на граф объектов CodeDOM, моделирующий компилируемый исходный код.The CodeDOM defines an object called a CodeCompileUnit, which can reference a CodeDOM object graph that models the source code to compile. В свойствах объекта CodeCompileUnit могут храниться ссылки на атрибуты, пространства имен и сборки.A CodeCompileUnit has properties for storing references to attributes, namespaces, and assemblies.

Поставщики CodeDom, производные от класса CodeDomProvider, содержат методы, которые обрабатывают граф объектов, на который ссылается CodeCompileUnit.The CodeDom providers that derive from the CodeDomProvider class contain methods that process the object graph referenced by a CodeCompileUnit.

Чтобы создать граф объектов для простого приложения, необходимо собрать модель исходного кода и сослаться на нее из CodeCompileUnit.To create an object graph for a simple application, you must assemble the source code model and reference it from a CodeCompileUnit.

В следующем примере приведен синтаксис для создания модуля компиляции.You can create a new compile unit with the syntax demonstrated in this example:

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

CodeSnippetCompileUnit может содержать раздел исходного кода, который уже написан на целевом языке, но не может быть преобразован в другой язык.A CodeSnippetCompileUnit can contain a section of source code that is already in the target language, but cannot be rendered to another language.

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

Чтобы определить пространство имен, необходимо создать объект CodeNamespace, а затем присвоить ему имя, используя подходящий конструктор или установив значение свойства Name.To define a namespace, create a CodeNamespace and assign a name for it using the appropriate constructor or by setting its Name property.

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

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

Чтобы добавить в пространство имен директиву импорта пространства имен, добавьте CodeNamespaceImport, который указывает пространство имен, которое следует импортировать в коллекцию CodeNamespace.Imports.To add a namespace import directive to the namespace, add a CodeNamespaceImport that indicates the namespace to import to the CodeNamespace.Imports collection.

В следующем фрагменте кода пространство имен System импортируется в коллекцию Imports объекта CodeNamespace с именем samples:The following code adds an import for the System namespace to the Imports collection of a CodeNamespace named samples:

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

Связывание элементов кода с графом объектовLinking code elements into the object graph

Все элементы кода, образующие граф CodeDOM, должны быть связаны с объектом CodeCompileUnit, являющимся корневым элементом дерева, последовательностью ссылок между элементами, на которые имеются прямые ссылки из свойств корневого объекта графа.All code elements that form a CodeDOM graph must be linked to the CodeCompileUnit that is the root element of the tree by a series of references between elements directly referenced from the properties of the root object of the graph. Чтобы задать ссылку из объекта-контейнера, необходимо присвоить объект свойству объекта-контейнера.Set an object to a property of a container object to establish a reference from the container object.

Приведенный ниже оператор добавляет samples CodeNamespace в свойство коллекции Namespaces корневого объекта CodeCompileUnit.The following statement adds the samples CodeNamespace to the Namespaces collection property of the root CodeCompileUnit.

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

Определение типаDefining a type

Чтобы объявить класс, структуру, интерфейс или перечисление с помощью CodeDOM, создайте объявление CodeTypeDeclaration и присвойте ему имя.To declare a class, structure, interface, or enumeration using the CodeDOM, create a new CodeTypeDeclaration, and assign it a name. В приведенном ниже примере демонстрируется использование перегрузки конструктора для задания значения свойства Name.The following example demonstrates this using a constructor overload to set the Name property:

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

Чтобы добавить тип в пространство имен, добавьте объект CodeTypeDeclaration, представляющий тип, который следует добавить в коллекцию Types пространства имен CodeNamespace.To add a type to a namespace, add a CodeTypeDeclaration that represents the type to add to the namespace to the Types collection of a CodeNamespace.

В следующем примере демонстрируется добавление класса class1 в пространство имен CodeNamespace с именем samples:The following example demonstrates how to add a class named class1 to a CodeNamespace named samples:

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

Добавление в класс членов классаAdding class members to a class

Пространство имен System.CodeDom предоставляет различные элементы, которые можно использовать для представления членов класса.The System.CodeDom namespace provides a variety of elements that can be used to represent class members. Каждый элемент класса может быть добавлен в коллекцию Members объекта CodeTypeDeclaration.Each class member can be added to the Members collection of a CodeTypeDeclaration.

Определение метода, являющегося точкой входа в код исполняемого файлаDefining a code entry point method for an executable

В случае сборки кода исполняемой программы необходимо указать точку входа в программу, создав объект CodeEntryPointMethod для представления метода, с которого должно начинаться выполнение программы.If you are building code for an executable program, it is necessary to indicate the entry point of a program by creating a CodeEntryPointMethod to represent the method at which program execution should begin.

В следующем примере показано, как определить метод точки входа, который содержит объект CodeMethodInvokeExpression, вызывающий System.Console.WriteLine для вывода текста "Hello World!":The following example demonstrates how to define an entry point method that contains a CodeMethodInvokeExpression that calls System.Console.WriteLine to print "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.The following statement adds the entry point method named Start to the Members collection of class1:

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

Теперь объект CodeCompileUnit с именем compileUnit содержит граф CodeDOM для простой программы "Hello World".Now the CodeCompileUnit named compileUnit contains the CodeDOM graph for a simple Hello World program. Сведения о создании и компиляции кода на основе графа CodeDOM см. в разделе Создание исходного кода и компиляция программы из графа CodeDOM.For information on generating and compiling code from a CodeDOM graph, see Generating Source Code and Compiling a Program from a CodeDOM Graph.

Дополнительные сведения о построении графа CodeDOMMore information on building a CodeDOM graph

CodeDOM поддерживает многие общие типы элементов кода, которые встречаются в языках программирования, поддерживающих среду CLR.The CodeDOM supports the many common types of code elements found in programming languages that support the common language runtime. Но CodeDOM не предусматривает предоставление элементов для представления всех возможных функций языков программирования.The CodeDOM was not designed to provide elements to represent all possible programming language features. Код, который не может быть без труда представлен элементами CodeDOM, можно инкапсулировать в объекты CodeSnippetExpression, CodeSnippetStatement, CodeSnippetTypeMember или CodeSnippetCompileUnit.Code that cannot be represented easily with CodeDOM elements can be encapsulated in a CodeSnippetExpression, a CodeSnippetStatement, a CodeSnippetTypeMember, or a CodeSnippetCompileUnit. Но фрагменты кода невозможно автоматически переводить с помощью CodeDOM на другие языки.However, snippets cannot be translated to other languages automatically by the CodeDOM.

Сведения о каждом типе CodeDOM см. в справочной документации по пространству имен System.CodeDom.For documentation for the each of the CodeDOM types, see the reference documentation for the System.CodeDom namespace.

Быстро найти элемент CodeDOM, представляющий определенный тип элемента кода, можно в разделе Краткий справочник по CodeDOM.For a quick chart to locate the CodeDOM element that represents a specific type of code element, see the CodeDOM Quick Reference.