CodeDOM 사용

CodeDOM은 소스 코드 요소의 다양한 일반적인 형식을 나타내는 형식을 제공합니다. 개체 그래프를 어셈블하는 데 CodeDOM 요소를 사용하는 소스 코드 모델을 빌드하는 프로그램을 디자인할 수 있습니다. 이 개체 그래프는 CodeDOM 코드 생성기를 사용하여 지원되는 프로그래밍 언어에 대한 소스 코드로 렌더링할 수 있습니다. CodeDOM은 소스 코드를 이진 어셈블리로 컴파일하는 데도 사용할 수 있습니다.

CodeDOM의 몇 가지 일반적인 용도는 다음과 같습니다.

  • 템플릿 기반 코드 생성: ASP.NET, XML Web services 클라이언트 프록시, 코드 마법사, 디자이너 또는 기타 코드 내보내기 메커니즘에 대한 코드를 생성합니다.
  • 동적 컴파일: 단일 또는 여러 언어로 코드 컴파일을 지원합니다.

CodeDOM 그래프 빌드

System.CodeDom 네임스페이스는 언어 구문에 관계없이 소스 코드의 논리 구조를 나타내기 위한 클래스를 제공합니다.

CodeDOM 그래프의 구조

CodeDOM 그래프 구조는 컨테이너 트리와 비슷합니다. 각 호환 가능한 CodeDOM 그래프의 최상위 또는 루트 컨테이너는 CodeCompileUnit입니다. 소스 코드 모델의 모든 요소는 그래프의 CodeObject 속성을 통해 그래프에 연결되어야 합니다.

샘플 헬로 월드 프로그램에 대한 소스 코드 모델 빌드

다음 연습에서는 간단한 Hello World 애플리케이션의 코드를 나타내는 CodeDOM 개체 그래프를 빌드하는 방법의 예제를 제공합니다. 이 코드 예제의 전체 소스 코드는 문서를 참조하세요 System.CodeDom.Compiler.CodeDomProvider .

컴파일 단위 만들기

CodeDOM은 컴파일할 소스 코드를 모델링하는 CodeDOM 개체 그래프를 참조할 수 있는 CodeCompileUnit라는 개체를 정의합니다. CodeCompileUnit에는 특성, 네임스페이스 및 어셈블리에 대한 참조를 저장하기 위한 속성이 있습니다.

CodeDomProvider 클래스에서 파생되는 CodeDom 공급자에는 CodeCompileUnit에서 참조되는 개체 그래프를 처리하는 메서드가 포함됩니다.

간단한 애플리케이션용 개체 그래프를 만들려면 소스 코드 모델을 어셈블하고 CodeCompileUnit에서 해당 모델을 참조해야 합니다.

이 예제에서 보여 주는 구문을 사용하여 새 컴파일 단위를 만들 수 있습니다.

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

A CodeSnippetCompileUnit 는 이미 대상 언어에 있지만 다른 언어로 렌더링할 수 없는 소스 코드 섹션을 포함할 수 있습니다.

네임스페이스 정의

네임스페이스를 정의하려면 CodeNamespace를 만들고 적절한 생성자를 사용하거나 Name 속성을 설정하여 이름을 지정합니다.

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

네임스페이스 가져오기

네임스페이스 가져오기 지시문을 네임스페이스에 추가하려면 가져올 네임스페이스를 나타내는 CodeNamespaceImportCodeNamespace.Imports 컬렉션에 추가합니다.

다음 코드는 System 네임스페이스의 가져오기를 samples라는 CodeNamespaceImports 컬렉션에 추가합니다.

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

CodeDOM 그래프를 형성하는 모든 코드 요소는 그래프의 루트 개체에 대한 속성에서 직접 참조되는 요소 간 일련의 참조를 통해 트리의 루트 요소인 CodeCompileUnit에 연결되어야 합니다. 개체를 컨테이너 개체의 속성으로 설정하여 컨테이너 개체에서 참조를 설정합니다.

다음 문은 samplesCodeNamespace를 루트 CodeCompileUnitNamespaces 컬렉션 속성에 추가합니다.

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")

형식을 네임스페이스에 추가하려면 네임스페이스에 추가할 형식을 나타내는 CodeTypeDeclarationCodeNamespaceTypes 컬렉션에 추가합니다.

다음 예제에서는 class1 클래스를 samples라는 CodeNamespace에 추가하는 방법을 보여 줍니다.

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

클래스에 클래스 멤버 추가

System.CodeDom 네임스페이스는 클래스 멤버를 나타내는 데 사용될 수 있는 다양한 요소를 제공합니다. 각 클래스 멤버를 CodeTypeDeclarationMembers 컬렉션에 추가할 수 있습니다.

실행 파일에 대한 코드 진입점 메서드 정의

실행 가능한 프로그램에 대한 코드를 빌드할 경우 프로그램 실행이 시작되어야 하는 메서드를 나타내기 위한 CodeEntryPointMethod를 만들어 프로그램의 진입점을 지정해야 합니다.

다음 예제에서는 "Hello World!"를 인쇄하기 위해 System.Console.WriteLine을 호출하는 CodeMethodInvokeExpression이 포함된 진입점 메서드를 정의하는 방법을 보여 줍니다.

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 컬렉션에 추가합니다.

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

이제 compileUnit라는 CodeCompileUnit에는 간단한 Hello World 프로그램에 대한 CodeDOM 그래프가 포함됩니다. CodeDOM 그래프에서 코드를 생성 및 컴파일하는 방법에 대한 자세한 내용은 CodeDOM 그래프에서 소스 코드 생성 및 프로그램 컴파일을 참조하세요.

CodeDOM 그래프 빌드에 대한 자세한 정보

CodeDOM은 공용 언어 런타임을 지원하는 프로그래밍 언어에 있는 코드 요소의 다양한 일반적인 형식을 지원합니다. CodeDOM이 모든 가능한 프로그래밍 언어 기능을 나타내는 요소를 제공하도록 디자인된 것은 아닙니다. CodeDOM 요소로 쉽게 나타낼 수 없는 코드는 CodeSnippetExpression, CodeSnippetStatement, CodeSnippetTypeMember 또는 CodeSnippetCompileUnit로 캡슐화할 수 있습니다. 하지만 코드 조각은 CodeDOM을 통해 자동으로 다른 언어로 변환할 수 없습니다.

각 CodeDOM 형식에 대한 문서는 System.CodeDom 네임스페이스에 대한 참조 문서를 참조하세요.

코드 요소의 특정 형식을 나타내는 CodeDOM 요소를 찾기 위한 빠른 차트는 CodeDOM 빠른 참조를 참조하세요.