使用 CodeDOM

CodeDOM 提供的類型代表許多常見的原始程式碼項目類型。 您可以設計程式,建置使用 CodeDOM 項目的原始程式碼模型,組合物件圖形。 此物件圖形可以轉譯成使用 CodeDOM 程式碼產生器的原始程式碼,處理受支援的程式設計語言。 您也可以使用 CodeDOM 將原始程式碼編譯成二進位組件。

常見的 CodeDOM 用法包括:

  • 產生樣板化程式碼:為 ASP.NET、XML Web 服務用戶端 proxy、程式碼精靈、設計工具,或其他程式碼發出機制產生程式碼。
  • 動態編譯:支援以單一或多種語言編譯程式碼。

建置 CodeDOM 圖形

System.CodeDom 命名空間提供代表原始程式碼邏輯結構的類別,不受語言語法影響。

CodeDOM 圖形的結構

CodeDOM 圖形的結構就像容器的樹狀結構。 每個可編譯 CodeDOM 圖形的最上層 (或根) 容器都是 CodeCompileUnit。 原始程式碼模型的每個項目都必須透過圖形中 CodeObject 屬性連結到圖形。

建置範例 Hello World 程式的原始程式碼模型

下列逐步解說提供如何建置 CodeDOM 物件圖形的範例,此物件圖形代表簡單的 Hello World 應用程式程式碼。 如需此程式碼範例的完整原始程式碼,請參閱 System.CodeDom.Compiler.CodeDomProvider 文章。

建立編譯單位

CodeDOM 會定義名為 CodeCompileUnit 的物件,如此可參考 CodeDOM 物件圖形,建立要編譯的原始程式碼模型。 CodeCompileUnit 的屬性可以儲存屬性、命名空間和組件的參考。

衍生自 CodeDomProvider 類別的 CodeDom 提供者有方法可處理 CodeCompileUnit 所參考的物件圖形。

若要建立簡單應用程式的物件圖形,您必須組合原始程式碼模型,並從 CodeCompileUnit 參考它。

您可以使用本例示範的語法,建立新的編譯單位:

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

CodeSnippetCompileUnit可以包含原始程式碼的區段,該區段已經位於目標語言中,但無法轉譯為另一種語言。

定義命名空間

若要定義命名空間,請使用適當的建構函式,或設定其 Name 屬性,建立 CodeNamespace 並指派其名稱。

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

匯入命名空間

若要將命名空間匯入指示詞新增至命名空間,請新增 CodeNamespaceImport,指示命名空間要匯入 CodeNamespace.Imports 集合。

下列程式碼會將匯入的 System 命名空間新增至名為 samplesCodeNamespaceImports 集合:

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

若要將類型新增到命名空間,請新增代表類型的 CodeTypeDeclaration,新增至 CodeNamespaceTypes 集合的命名空間。

下列範例示範如何將名為 class1 的類別新增至名為 samplesCodeNamespace

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

將類別成員新增至類別

System.CodeDom 命名空間提供各種不同的項目,可以用來代表類別成員。 每個類別成員皆可新增至 CodeTypeDeclarationMembers 集合。

定義可執行檔的程式代碼進入點方法

如果您要為可執行程式建置程式碼,就必須建立 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 的進入點方法新增至 class1Members 集合:

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

現在名為 compileUnitCodeCompileUnit 包含簡單 Hello World 程式的 CodeDOM 圖形。 如需從 CodeDOM 圖形產生及編譯程式碼的相關資訊,請參閱從 CodeDOM 圖形產生原始程式碼和編譯程式

建置 CodeDOM 圖形的詳細資訊

CodeDOM 支援許多程式設計語言中常見的程式碼項目類型,這些程式設計語言都支援 Common Language Runtime。 CodeDOM 的設計目的不是提供代表所有可能程式設計語言功能的項目。 無法簡單以 CodeDOM 項目表示的程式碼,可以封裝在 CodeSnippetExpressionCodeSnippetStatementCodeSnippetTypeMemberCodeSnippetCompileUnit 中。 不過,CodeDOM 無法自動將程式碼片段轉譯成其他語言。

如需 CodeDOM 各類型的文件,請參閱 System.CodeDom 命名空間的參考文件。

如需快速圖表,找出表示特定程式碼項目類型的 CodeDOM 項目,請參閱 CodeDOM 快速參考