CodeDOM 사용Using 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 Web services 클라이언트 프록시, 코드 마법사, 디자이너 또는 기타 코드 내보내기 메커니즘에 대한 코드를 생성합니다.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.

CodeDOM 그래프 빌드Building a CodeDOM Graph

System.CodeDom 네임스페이스는 언어 구문에 관계없이 소스 코드의 논리 구조를 나타내기 위한 클래스를 제공합니다.The System.CodeDom namespace provides classes for representing the logical structure of source code, independent of language syntax.

CodeDOM 그래프 구조The 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

다음 연습에서는 간단한 Hello World 애플리케이션의 코드를 나타내는 CodeDOM 개체 그래프를 빌드하는 방법의 예제를 제공합니다.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은 컴파일할 소스 코드를 모델링하는 CodeDOM 개체 그래프를 참조할 수 있는 CodeCompileUnit라는 개체를 정의합니다.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.

CodeDomProvider 클래스에서 파생되는 CodeDom 공급자에는 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

네임스페이스 가져오기 지시문을 네임스페이스에 추가하려면 가져올 네임스페이스를 나타내는 CodeNamespaceImportCodeNamespace.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 네임스페이스의 가져오기를 samples라는 CodeNamespaceImports 컬렉션에 추가합니다.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를 루트 CodeCompileUnitNamespaces 컬렉션 속성에 추가합니다.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")

형식을 네임스페이스에 추가하려면 네임스페이스에 추가할 형식을 나타내는 CodeTypeDeclarationCodeNamespaceTypes 컬렉션에 추가합니다.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 클래스를 samples라는 CodeNamespace에 추가하는 방법을 보여 줍니다.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. 각 클래스 멤버를 CodeTypeDeclarationMembers 컬렉션에 추가할 수 있습니다.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.

다음 예제에서는 "Hello World!"를 인쇄하기 위해 System.Console.WriteLine을 호출하는 CodeMethodInvokeExpression이 포함된 진입점 메서드를 정의하는 방법을 보여 줍니다.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라는 진입점 메서드를 class1Members 컬렉션에 추가합니다.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)

이제 compileUnit라는 CodeCompileUnit에는 간단한 Hello World 프로그램에 대한 CodeDOM 그래프가 포함됩니다.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.

CodeDOM 그래프 빌드에 대한 자세한 정보More information on building a CodeDOM graph

CodeDOM은 공용 언어 런타임을 지원하는 프로그래밍 언어에 있는 코드 요소의 다양한 일반적인 형식을 지원합니다.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.