Share via


使用 CodeDOM

CodeDOM 提供表示多種原始程式碼項目一般型別的型別。 您可以設計一個程式來建置使用 CodeDOM 項目的原始程式碼模型,以組譯物件 Graph。 這個物件 Graph 可以使用受支援的程式語言的 CodeDOM 程式碼產生器,轉譯成原始程式碼。 CodeDOM 也可以用於將原始程式碼編譯為二進位組件。

CodeDOM 的一些一般運用包括:

  • 樣板化程式碼產生:為 ASP.NET、XML Web Service 用戶端 Proxy、程式碼精靈、設計工具或其他程式碼發出機制產生程式碼。

  • 動態編譯:支援使用單一或多種語言的程式碼編譯。

建置 CodeDOM 物件 Graph

System.CodeDom 命名空間提供了表示原始程式碼邏輯結構的類別,不限定語言語法。

CodeDOM 物件 Graph 的結構

CodeDOM 物件 Graph 的結構就像容器樹狀結構。 每個可編譯的 CodeDOM 物件 Graph 最上面的容器或根容器為 CodeCompileUnit。 原始程式碼模型的每個項目都必須在 Graph 中,透過 CodeObject 的屬性連結到 Graph。

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

以下逐步解說提供的範例,示範如何建置表示簡單 Hello World 應用程式程式碼的 CodeDOM 物件 Graph。 如需這個程式碼範例的完整原始程式碼,請參閱 System.CodeDom.Compiler.CodeDomProvider 主題。

建立編譯單位

CodeDOM 會定義一個名為 CodeCompileUnit 的物件,它可以參考做為要編譯之原始程式碼的模型之 CodeDOM 物件 Graph。 CodeCompileUnit 的屬性 (Property) 可以儲存對屬性 (Attribute)、命名空間和組件的參考。

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

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

您可以使用這個範例中示範的語法建立新的編譯單元:

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

CodeSnippetCompileUnit 可以包含已經在目標語言中的原始程式碼區段,但是不能轉譯為其他語言。

定義命名空間

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

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

匯入命名空間

若要將命名空間匯入指示詞加入到命名空間,請加入指示要將命名空間匯入 CodeNamespace.Imports 集合的 CodeNamespaceImport

下列程式碼將 System 命名空間的匯入加入到名為 samples 之 CodeNamespaceImports 集合中:

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

將程式碼項目連結到物件 Graph 中

所有組成 CodeDOM 物件 Graph 的程式碼項目,都必須由 Graph 根物件屬性所直接參考項目之間的一系列參考來連結到 CodeCompileUnit,後者是樹狀結構的根項目。 將物件設定為容器物件的屬性,建立來自容器物件的參考。

下列陳述式會將 samples CodeNamespace 加入到根 CodeCompileUnitNamespaces 集合屬性中。

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

定義型別

若要使用 CodeDOM 宣告類別、結構、介面或列舉型別,請建立一個新的 CodeTypeDeclaration,並為它指派一個名稱。 下列範例使用建構函式多載,設定 Name 屬性來示範這項工作:

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

若要將型別加入命名空間,請加入表示此型別的 CodeTypeDeclaration,將命名空間加入到 CodeNamespaceTypes 集合。

下列範例示範如何將名為 class1 的類別加入到名為 samples 的 CodeNamespace

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

將類別成員加入到類別

System.CodeDom 命名空間提供多種可以用來表示類別成員的項目。 每個類別成員都可以加入到 CodeTypeDeclarationMembers 集合中。

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

如果您正在建置可執行程式的程式碼,就需要指示程式的進入點,其方法是建立 CodeEntryPointMethod,以表示程式執行應該開始的方法。

下列範例將示範如何定義進入點方法,它含有呼叫 System.Console.WriteLine 來顯示 "Hello World!" 的 CodeMethodInvokeExpression

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

下列陳述式將名為 Start 的進入點方法加入到 class1 的 Members 集合中:

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

現在,名為 CompileUnit 的 CodeCompileUnit 包含了簡單 Hello World 程式的 CodeDOM 物件 Graph。 如需從 CodeDOM 圖形產生及編譯程式碼的詳細資訊,請參閱從 CodeDOM 圖形產生原始程式碼及編譯程式

建置 CodeDOM 物件 Graph 的詳細資訊

CodeDOM 支援很多可以在支援 Common Language Runtime 的程式語言中找到的程式碼項目一般型別。 CodeDOM 並非設計用來提供能表示所有可能之程式語言功能的項目。 不容易以 CodeDOM 項目表示的程式碼可以封裝在 CodeSnippetExpressionCodeSnippetStatementCodeSnippetTypeMemberCodeSnippetCompileUnit 中。 然而,片段不能使用 CodeDOM 自動轉譯成其他語言。

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

如需用來尋找表示特定程式碼項目型別之 CodeDOM 項目的快查圖表,請參閱 CodeDOM 快速參考