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 物件圖形,建立要編譯的原始程式碼模型。 A CodeCompileUnit 擁有儲存屬性、命名空間與組件的參考的屬性。
衍生自 CodeDomProvider 類別的 CodeDom 提供者有方法可處理 CodeCompileUnit 所參考的物件圖形。
若要建立簡單應用程式的物件圖形,您必須組合原始程式碼模型,並從 CodeCompileUnit 參考它。
您可以使用本例示範的語法,建立新的編譯單位:
CodeCompileUnit^ compileUnit = gcnew CodeCompileUnit();
CodeCompileUnit compileUnit = new CodeCompileUnit();
Dim compileUnit As New CodeCompileUnit()
CodeSnippetCompileUnit 可以包含已使用目標語言的原始程式碼區段,但無法轉譯成其他語言。
定義命名空間
要定義命名空間,請建立一個 CodeNamespace 並使用適當的建構子或設定其 Name 屬性來指派名稱。
CodeNamespace^ samples = gcnew CodeNamespace("Samples");
CodeNamespace samples = new CodeNamespace("Samples");
Dim samples As New CodeNamespace("Samples")
匯入命名空間
若要將命名空間匯入指示詞新增至命名空間,請新增 CodeNamespaceImport,指示命名空間要匯入 CodeNamespace.Imports 集合。
以下程式碼將匯入的System命名空間加入CodeNamespace類型的Imports集合中,該CodeNamespace命名為samples:
samples->Imports->Add(gcnew CodeNamespaceImport("System"));
samples.Imports.Add(new CodeNamespaceImport("System"));
samples.Imports.Add(new CodeNamespaceImport("System"))
將程式碼項目連結到物件圖形
形成 CodeDOM 圖形的所有程式碼項目都必須連結到 CodeCompileUnit,亦即樹狀結構的根項目,此樹狀結構是圖形根物件屬性直接參考項目間的一系列參考。 設定容器物件屬性的物件,從容器物件建立參考。
以下陳述將 samplesCodeNamespace 添加到根CodeCompileUnit的Namespaces集合屬性中。
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 加入 Types 集合中的 CodeNamespace。
以下範例示範如何將名為 class1 的類別新增到一個名為 samples 的 CodeNamespace。
samples->Types->Add(class1);
samples.Types.Add(class1);
samples.Types.Add(class1)
將類別成員新增至類別
System.CodeDom 命名空間提供各種不同的項目,可以用來代表類別成員。 每個類別成員都可以加入 Members 的集合 CodeTypeDeclaration中。
定義可執行檔的程式碼進入點方法
如果您要為可執行程式建置程式碼,就必須建立 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的入口點方法加入到Members集合中的class1中:
class1->Members->Add(start);
class1.Members.Add( start );
class1.Members.Add(start)
現在名為 CodeCompileUnit 的 compileUnit 包含簡單 Hello World 程式的 CodeDOM 圖形。 如需從 CodeDOM 圖形產生及編譯程式碼的相關資訊,請參閱從 CodeDOM 圖形產生原始程式碼和編譯程式。
建置 CodeDOM 圖形的詳細資訊
CodeDOM 支援許多程式設計語言中常見的程式碼項目類型,這些程式設計語言都支援 Common Language Runtime。 CodeDOM 的設計目的不是提供代表所有可能程式設計語言功能的項目。 無法簡單以 CodeDOM 項目表示的程式碼,可以封裝在 CodeSnippetExpression、CodeSnippetStatement、CodeSnippetTypeMember 或 CodeSnippetCompileUnit 中。 不過,CodeDOM 無法自動將程式碼片段轉譯成其他語言。
如需 CodeDOM 各類型的文件,請參閱 System.CodeDom 命名空間的參考文件。
如需快速圖表,找出表示特定程式碼項目類型的 CodeDOM 項目,請參閱 CodeDOM 快速參考。