CodeDomProvider クラス

CodeDomProvider の実装の基本クラスを提供します。このクラスは抽象クラスです。

この型のすべてのメンバの一覧については、CodeDomProvider メンバ を参照してください。

System.Object
   System.MarshalByRefObject
      System.ComponentModel.Component
         System.CodeDom.Compiler.CodeDomProvider
            Microsoft.CSharp.CSharpCodeProvider
            Microsoft.VisualBasic.VBCodeProvider

MustInherit Public Class CodeDomProvider
   Inherits Component
[C#]
public abstract class CodeDomProvider : Component
[C++]
public __gc __abstract class CodeDomProvider : public Component
[JScript]
public abstract class CodeDomProvider extends Component

スレッドセーフ

この型の public static (Visual Basicでは Shared) のすべてのメンバは、マルチスレッド操作で安全に使用できます。インスタンスのメンバの場合は、スレッドセーフであるとは限りません。

解説

CodeDomProvider を使用して、コード ジェネレータとコード コンパイラのインスタンスを作成および取得できます。コード ジェネレータを使用して特定の言語のコードを生成でき、コード コンパイラを使用してコードをアセンブリにコンパイルできます。

通常、 CodeDomProvider の実装には、単一のプログラム言語に対応するコード生成とコンパイルの管理を行うために、コード生成やコード コンパイルのインターフェイスが用意されています。.NET Framework SDK と共に出荷される CodeDomProvider の実装では、複数の言語がサポートされます。サポートされる言語には、C#、Visual Basic、Managed C++、J#.NET、および JScript が含まれます。開発者やコンパイラ ベンダは、 ICodeGenerator インターフェイスと ICodeCompiler インターフェイスを実装して、CodeDom サポートを他のプログラミング言語に拡張する CodeDomProvider を提供できます。

使用例

[Visual Basic, C#, C++] System.Console クラスを使用して "Hello World" と表示するプログラムの CodeDOM モデルに基づいて、ソース コードの生成とコンパイルを実行できるプログラム例を次に示します。Windows フォームのユーザー インターフェイスが用意されています。ユーザーは、C#、Visual Basic、および JScript という複数の選択肢から、対象プログラミング言語を選択できます。

 
Imports System
Imports System.CodeDom
Imports System.CodeDom.Compiler
Imports System.Collections
Imports System.ComponentModel
Imports System.Diagnostics
Imports System.Drawing
Imports System.IO
Imports System.Windows.Forms
Imports Microsoft.CSharp
Imports Microsoft.VisualBasic
Imports Microsoft.JScript

' This example demonstrates building a Hello World program graph 
' using System.CodeDom elements. It calls code generator and
' code compiler methods to build the program using CSharp, VB, or
' JScript.  A Windows Forms interface is included. Note: Code
' must be compiled and linked with the Microsoft.JScript assembly. 
Namespace CodeDOMExample
   
    Public Class CodeDomExample
        ' Build a Hello World program graph using 
        ' System.CodeDom types.
        Public Shared Function BuildHelloWorldGraph() As CodeCompileUnit

            ' Create a new CodeCompileUnit to contain 
            ' the program graph.
            Dim compileUnit As New CodeCompileUnit()
      
            ' Declare a new namespace called Samples.
            Dim samples As New CodeNamespace("Samples")

            ' Add the new namespace to the compile unit.
            compileUnit.Namespaces.Add(samples)
      
            ' Add the new namespace import for the System namespace.
            samples.Imports.Add(New CodeNamespaceImport("System"))
      
            ' Declare a new type called Class1.
            Dim class1 As New CodeTypeDeclaration("Class1")

            ' Add the new type to the namespace type collection.
            samples.Types.Add(class1)
      
            ' Declare a new code entry point method.
            Dim start As New CodeEntryPointMethod()
      
            ' Create a type reference for the System.Console class.
            Dim csSystemConsoleType As New CodeTypeReferenceExpression( _
                "System.Console")
      
            ' Build a Console.WriteLine statement.
            Dim cs1 As New CodeMethodInvokeExpression( _
                csSystemConsoleType, "WriteLine", _
                New CodePrimitiveExpression("Hello World!"))

            ' Add the WriteLine call to the statement collection.
            start.Statements.Add(cs1)
      
            ' Build another Console.WriteLine statement.
            Dim cs2 As New CodeMethodInvokeExpression( _
                csSystemConsoleType, "WriteLine", _
                New CodePrimitiveExpression("Press the Enter key to continue."))

            ' Add the WriteLine call to the statement collection.
            start.Statements.Add(cs2)
      
            ' Build a call to System.Console.ReadLine.
            Dim csReadLine As New CodeMethodInvokeExpression( _
                csSystemConsoleType, "ReadLine")
    
            ' Add the ReadLine statement.
            start.Statements.Add(csReadLine)
      
            ' Add the code entry point method to
            ' the Members collection of the type.
            class1.Members.Add(start)
      
            Return compileUnit
        End Function 

        Public Shared Sub GenerateCode(ByVal provider As CodeDomProvider, ByVal compileunit As CodeCompileUnit)
            
            ' Build the source file name with the appropriate
            ' language extension.
            Dim sourceFile As String
            If provider.FileExtension.StartsWith(".")
                sourceFile = "TestGraph" + provider.FileExtension
            Else
                sourceFile = "TestGraph." + provider.FileExtension
            End If

            ' Obtain an ICodeGenerator from the CodeDomProvider.
            Dim gen As ICodeGenerator = provider.CreateGenerator()

            ' Create an IndentedTextWriter, constructed with
            ' a StreamWriter to the source file.
            Dim tw As New IndentedTextWriter(New StreamWriter(sourceFile, False), "    ")
            ' Generate source code using the code generator.
            gen.GenerateCodeFromCompileUnit(compileunit, tw, New CodeGeneratorOptions())
            ' Close the output file.
            tw.Close()
        End Sub 

        Public Shared Function CompileCode(ByVal provider As CodeDomProvider, _
                                           ByVal sourceFile As string,        _
                                           ByVal exeFile As string) As CompilerResults
            ' Obtain an ICodeCompiler from the CodeDomProvider.
            Dim compiler As ICodeCompiler = provider.CreateCompiler()

            ' Configure a CompilerParameters that links System.dll
            ' and produces the specified executable file.
            Dim referenceAssemblies As String() = {"System.dll"}
            Dim cp As New CompilerParameters(referenceAssemblies, exeFile, False)
            
            ' Generate an executable rather than a DLL file.
            cp.GenerateExecutable = True

            ' Invoke compilation.
            Dim cr As CompilerResults = compiler.CompileAssemblyFromFile(cp, _
                sourceFile)
            ' Return the results of compilation.
            Return cr
        End Function 
    End Class 
    
    Public Class CodeDomExampleForm
        Inherits System.Windows.Forms.Form
        Private run_button As New System.Windows.Forms.Button()
        Private compile_button As New System.Windows.Forms.Button()
        Private generate_button As New System.Windows.Forms.Button()
        Private textBox1 As New System.Windows.Forms.TextBox()
        Private comboBox1 As New System.Windows.Forms.ComboBox()
        Private label1 As New System.Windows.Forms.Label()

        Private Sub generate_button_Click(ByVal sender As Object, ByVal e As System.EventArgs)
            Dim provider As CodeDomProvider = GetCurrentProvider()
            CodeDomExample.GenerateCode(provider, CodeDomExample.BuildHelloWorldGraph())

            ' Build the source file name with the appropriate
            ' language extension.
            Dim sourceFile As String
            If provider.FileExtension.StartsWith(".")
                sourceFile = "TestGraph" + provider.FileExtension
            Else
                sourceFile = "TestGraph." + provider.FileExtension
            End If

            ' Read in the generated source file and
            ' display the source text.
            Dim sr As New StreamReader(sourceFile)
            textBox1.Text = sr.ReadToEnd()
            sr.Close()
        End Sub 

        Private Sub compile_button_Click(ByVal sender As Object, ByVal e As System.EventArgs)
            Dim provider As CodeDomProvider = GetCurrentProvider()

            ' Build the source file name with the appropriate
            ' language extension.
            Dim sourceFile As String
            If provider.FileExtension.StartsWith(".")
                sourceFile = "TestGraph" + provider.FileExtension
            Else
                sourceFile = "TestGraph." + provider.FileExtension
            End If

            Dim cr As CompilerResults = CodeDomExample.CompileCode(provider,     _
                                                                   sourceFile,   _
                                                                   "TestGraph.EXE")

            If cr.Errors.Count > 0 Then
                ' Display compilation errors.
                textBox1.Text = "Errors encountered while building " + _
                                sourceFile + " into " +                _ 
                                cr.PathToAssembly + ": " + ControlChars.CrLf

                Dim ce As System.CodeDom.Compiler.CompilerError
                For Each ce In cr.Errors
                    textBox1.AppendText(ce.ToString() + ControlChars.CrLf)
                Next ce
                run_button.Enabled = False
            Else
                textBox1.Text = "Source " + sourceFile + " built into " + _
                                cr.PathToAssembly + " with no errors."
                run_button.Enabled = True
            End If        
        End Sub 

        Private Sub run_button_Click(ByVal sender As Object, _
            ByVal e As System.EventArgs)

            Process.Start("TestGraph.EXE")
        End Sub 

        Private Function GetCurrentProvider() As CodeDomProvider

            Dim provider As CodeDomProvider
            Select Case CStr(Me.comboBox1.SelectedItem)
                Case "CSharp"
                    provider = New CSharpCodeProvider()
                Case "Visual Basic"
                    provider = New VBCodeProvider()
                Case "JScript"
                    provider = New JScriptCodeProvider()
                Case Else
                    provider = New CSharpCodeProvider()
            End Select
            Return provider
        End Function

        Public Sub New()
            Me.SuspendLayout()
            ' Set properties for label1.
            Me.label1.Location = New System.Drawing.Point(395, 20)
            Me.label1.Size = New Size(180, 22)
            Me.label1.Text = "Select a programming language:"
            ' Set properties for comboBox1.
            Me.comboBox1.Location = New System.Drawing.Point(560, 16)
            Me.comboBox1.Size = New Size(190, 23)
            Me.comboBox1.Name = "comboBox1"
            Me.comboBox1.Items.AddRange(New String() {"CSharp", "Visual Basic", "JScript"})
            Me.comboBox1.Anchor = System.Windows.Forms.AnchorStyles.Left Or System.Windows.Forms.AnchorStyles.Right Or System.Windows.Forms.AnchorStyles.Top
            Me.comboBox1.SelectedIndex = 0
            ' Set properties for generate_button.
            Me.generate_button.Location = New System.Drawing.Point(8, 16)
            Me.generate_button.Name = "generate_button"
            Me.generate_button.Size = New System.Drawing.Size(120, 23)
            Me.generate_button.Text = "Generate Code"
            AddHandler generate_button.Click, AddressOf Me.generate_button_Click
            ' Set properties for compile_button.
            Me.compile_button.Location = New System.Drawing.Point(136, 16)
            Me.compile_button.Name = "compile_button"
            Me.compile_button.Size = New System.Drawing.Size(120, 23)
            Me.compile_button.Text = "Compile"
            AddHandler compile_button.Click, AddressOf Me.compile_button_Click
            ' Set properties for run_button.
            Me.run_button.Enabled = False
            Me.run_button.Location = New System.Drawing.Point(264, 16)
            Me.run_button.Name = "run_button"
            Me.run_button.Size = New System.Drawing.Size(120, 23)
            Me.run_button.Text = "Run"
            AddHandler run_button.Click, AddressOf Me.run_button_Click
            ' Set properties for textBox1.
            Me.textBox1.Anchor = System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Bottom Or System.Windows.Forms.AnchorStyles.Left Or System.Windows.Forms.AnchorStyles.Right
            Me.textBox1.Location = New System.Drawing.Point(8, 48)
            Me.textBox1.Multiline = True
            Me.textBox1.ScrollBars = System.Windows.Forms.ScrollBars.Vertical
            Me.textBox1.Name = "textBox1"
            Me.textBox1.Size = New System.Drawing.Size(744, 280)
            Me.textBox1.Text = ""
            ' Set properties for the CodeDomExampleForm.
            Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)
            Me.ClientSize = New System.Drawing.Size(768, 340)
            Me.MinimumSize = New System.Drawing.Size(750, 340)
            Me.Controls.AddRange(New System.Windows.Forms.Control() {Me.textBox1, _
                Me.run_button, Me.compile_button, Me.generate_button, _
                Me.comboBox1, Me.label1})
            Me.Name = "CodeDomExampleForm"
            Me.Text = "CodeDom Hello World Example"
            Me.ResumeLayout(False)
        End Sub 

        Protected Overloads Sub Dispose(ByVal disposing As Boolean)
            MyBase.Dispose(disposing)
        End Sub 

        <STAThread()> _
        Shared Sub Main()
            Application.Run(New CodeDomExampleForm())
        End Sub 
    End Class 
End Namespace 

[C#] 
using System;
using System.CodeDom;
using System.CodeDom.Compiler;
using System.Collections;
using System.ComponentModel;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Windows.Forms;
using Microsoft.CSharp;
using Microsoft.VisualBasic;
using Microsoft.JScript;
    
// This example demonstrates building a Hello World program graph 
// using System.CodeDom elements. It calls code generator and
// code compiler methods to build the program using CSharp, VB, or
// JScript.  A Windows Forms interface is included. Note: Code
// must be compiled and linked with the Microsoft.JScript assembly. 
namespace CodeDOMExample
{    
    public class CodeDomExample
    {
        // Build a Hello World program graph using 
        // System.CodeDom types.
        public static CodeCompileUnit BuildHelloWorldGraph()
        {
            // Create a new CodeCompileUnit to contain 
            // the program graph.
            CodeCompileUnit compileUnit = new CodeCompileUnit();

            // Declare a new namespace called Samples.
            CodeNamespace samples = new CodeNamespace("Samples");
            // Add the new namespace to the compile unit.
            compileUnit.Namespaces.Add( samples );

            // Add the new namespace import for the System namespace.
            samples.Imports.Add( new CodeNamespaceImport("System") );            

            // Declare a new type called Class1.
            CodeTypeDeclaration class1 = new CodeTypeDeclaration("Class1");
            // Add the new type to the namespace type collection.
            samples.Types.Add(class1);
            
            // Declare a new code entry point method.
            CodeEntryPointMethod start = new CodeEntryPointMethod();

            // Create a type reference for the System.Console class.
            CodeTypeReferenceExpression csSystemConsoleType = new CodeTypeReferenceExpression("System.Console");

            // Build a Console.WriteLine statement.
            CodeMethodInvokeExpression cs1 = new CodeMethodInvokeExpression( 
                csSystemConsoleType, "WriteLine", 
                new CodePrimitiveExpression("Hello World!") );

            // Add the WriteLine call to the statement collection.
            start.Statements.Add(cs1);

            // Build another Console.WriteLine statement.
            CodeMethodInvokeExpression cs2 = new CodeMethodInvokeExpression(
                csSystemConsoleType, "WriteLine",
                new CodePrimitiveExpression("Press the Enter key to continue.") );

            // Add the WriteLine call to the statement collection.
            start.Statements.Add(cs2);

            // Build a call to System.Console.ReadLine.
            CodeMethodInvokeExpression csReadLine = new CodeMethodInvokeExpression(
                csSystemConsoleType, "ReadLine");

            // Add the ReadLine statement.
            start.Statements.Add(csReadLine);

            // Add the code entry point method to
            // the Members collection of the type.
            class1.Members.Add( start );

            return compileUnit;
        }        

        public static void GenerateCode(CodeDomProvider provider, 
            CodeCompileUnit compileunit)
        {
            // Build the source file name with the appropriate
            // language extension.
            String sourceFile;
            if (provider.FileExtension[0] == '.')
            {
                sourceFile = "TestGraph" + provider.FileExtension;
            }
            else 
            {
                sourceFile = "TestGraph." + provider.FileExtension;
            }

            // Obtain an ICodeGenerator from the CodeDomProvider.
            ICodeGenerator gen = provider.CreateGenerator();
            // Create an IndentedTextWriter, constructed with
            // a StreamWriter to the source file.
            IndentedTextWriter tw = new IndentedTextWriter(new StreamWriter(sourceFile, false), "    ");
            // Generate source code using the code generator.
            gen.GenerateCodeFromCompileUnit(compileunit, tw, new CodeGeneratorOptions());
            // Close the output file.
            tw.Close();            
        }

        public static CompilerResults CompileCode(CodeDomProvider provider, 
                                                  String sourceFile, 
                                                  String exeFile)
        {
            // Obtain an ICodeCompiler from the CodeDomProvider.
            ICodeCompiler compiler = provider.CreateCompiler();
            // Configure a CompilerParameters that links System.dll
            // and produces the specified executable file.
            String [] referenceAssemblies = {"System.dll"};
            CompilerParameters cp = new CompilerParameters(referenceAssemblies,
                                                           exeFile, false);
            // Generate an executable rather than a DLL file.
            cp.GenerateExecutable = true;            

            // Invoke compilation.
            CompilerResults cr = compiler.CompileAssemblyFromFile(cp, sourceFile);
            // Return the results of compilation.
            return cr;
        }
    }

    public class CodeDomExampleForm : System.Windows.Forms.Form
    {
        private System.Windows.Forms.Button run_button = new System.Windows.Forms.Button();
        private System.Windows.Forms.Button compile_button = new System.Windows.Forms.Button();
        private System.Windows.Forms.Button generate_button = new System.Windows.Forms.Button();
        private System.Windows.Forms.TextBox textBox1 = new System.Windows.Forms.TextBox();
        private System.Windows.Forms.ComboBox comboBox1 = new System.Windows.Forms.ComboBox();
        private System.Windows.Forms.Label label1 = new System.Windows.Forms.Label();
        
        private void generate_button_Click(object sender, System.EventArgs e)
        {
            CodeDomProvider provider = GetCurrentProvider();
            CodeDomExample.GenerateCode(provider, CodeDomExample.BuildHelloWorldGraph());

            // Build the source file name with the appropriate
            // language extension.
            String sourceFile;
            if (provider.FileExtension[0] == '.')
            {
                sourceFile = "TestGraph" + provider.FileExtension;
            }
            else 
            {
                sourceFile = "TestGraph." + provider.FileExtension;
            }
            
            // Read in the generated source file and
            // display the source text.
            StreamReader sr = new StreamReader(sourceFile);
            textBox1.Text = sr.ReadToEnd();
            sr.Close();
        }

        private void compile_button_Click(object sender, System.EventArgs e)
        {
            CodeDomProvider provider = GetCurrentProvider();

            // Build the source file name with the appropriate
            // language extension.
            String sourceFile;
            if (provider.FileExtension[0] == '.')
            {
                sourceFile = "TestGraph" + provider.FileExtension;
            }
            else 
            {
                sourceFile = "TestGraph." + provider.FileExtension;
            }

            // Compile the source file into an executable output file.
            CompilerResults cr = CodeDomExample.CompileCode(provider, 
                                                            sourceFile, 
                                                            "TestGraph.exe");

            if(cr.Errors.Count > 0)
            {
                // Display compilation errors.
                textBox1.Text = "Errors encountered while building " + 
                                sourceFile + " into " +cr.PathToAssembly+": \r\n\n";
                foreach(CompilerError ce in cr.Errors)                
                    textBox1.AppendText(ce.ToString()+"\r\n");                                
                run_button.Enabled = false;
            }
            else
            {
                textBox1.Text = "Source " + sourceFile + " built into " + 
                                cr.PathToAssembly+" with no errors.";
                run_button.Enabled = true;
            }
        }

        private void run_button_Click(object sender, 
            System.EventArgs e)
        {
            Process.Start("TestGraph.exe");            
        }
        
        private CodeDomProvider GetCurrentProvider()
        {
            CodeDomProvider provider;
            switch((string)this.comboBox1.SelectedItem)
            {
                case "CSharp":
                    provider = new CSharpCodeProvider();
                    break;
                case "Visual Basic":
                    provider = new VBCodeProvider();
                    break;
                case "JScript":
                    provider = new JScriptCodeProvider();
                    break;
                default:
                    provider = new CSharpCodeProvider();
                    break;
            }
            return provider;
        }

        public CodeDomExampleForm()
        {
            this.SuspendLayout();            
            // Set properties for label1
            this.label1.Location = new System.Drawing.Point(395, 20);
            this.label1.Size = new Size(180, 22);
            this.label1.Text = "Select a programming language:";            
            // Set properties for comboBox1
            this.comboBox1.Location = new System.Drawing.Point(560, 16);
            this.comboBox1.Size = new Size(190, 23);
            this.comboBox1.Name = "comboBox1";
            this.comboBox1.Items.AddRange( new string[] { "CSharp", "Visual Basic", "JScript" } );
            this.comboBox1.Anchor = System.Windows.Forms.AnchorStyles.Left
                                    | System.Windows.Forms.AnchorStyles.Right 
                                    | System.Windows.Forms.AnchorStyles.Top;
            this.comboBox1.SelectedIndex = 0;
            // Set properties for generate_button. 
            this.generate_button.Location = new System.Drawing.Point(8, 16);
            this.generate_button.Name = "generate_button";
            this.generate_button.Size = new System.Drawing.Size(120, 23);            
            this.generate_button.Text = "Generate Code";
            this.generate_button.Click += new System.EventHandler(this.generate_button_Click);            
            // Set properties for compile_button.
            this.compile_button.Location = new System.Drawing.Point(136, 16);
            this.compile_button.Name = "compile_button";
            this.compile_button.Size = new System.Drawing.Size(120, 23);            
            this.compile_button.Text = "Compile";
            this.compile_button.Click += new System.EventHandler(this.compile_button_Click);            
            // Set properties for run_button.
            this.run_button.Enabled = false;
            this.run_button.Location = new System.Drawing.Point(264, 16);
            this.run_button.Name = "run_button";
            this.run_button.Size = new System.Drawing.Size(120, 23);            
            this.run_button.Text = "Run";
            this.run_button.Click += new System.EventHandler(this.run_button_Click);            
            // Set properties for textBox1.        
            this.textBox1.Anchor = (System.Windows.Forms.AnchorStyles.Top
                                     | System.Windows.Forms.AnchorStyles.Bottom
                                     | System.Windows.Forms.AnchorStyles.Left 
                                     | System.Windows.Forms.AnchorStyles.Right);
            this.textBox1.Location = new System.Drawing.Point(8, 48);
            this.textBox1.Multiline = true;
            this.textBox1.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;
            this.textBox1.Name = "textBox1";
            this.textBox1.Size = new System.Drawing.Size(744, 280);            
            this.textBox1.Text = "";            
            // Set properties for the CodeDomExampleForm.
            this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
            this.ClientSize = new System.Drawing.Size(768, 340);
            this.MinimumSize = new System.Drawing.Size(750, 340);
            this.Controls.AddRange(new System.Windows.Forms.Control[] {this.textBox1, 
                this.run_button, this.compile_button, this.generate_button,
                this.comboBox1, this.label1 });
            this.Name = "CodeDomExampleForm";
            this.Text = "CodeDom Hello World Example";
            this.ResumeLayout(false);
        }

        protected override void Dispose( bool disposing )
        {
            base.Dispose( disposing );
        }

        [STAThread]
        static void Main() 
        {
            Application.Run(new CodeDomExampleForm());
        }
    }
}

[C++] 
#using <mscorlib.dll>
#using <System.Windows.Forms.dll>
#using <System.Drawing.dll>
#using <System.dll>
#using <Microsoft.JScript.dll>
#using <Cscompmgd.dll>

using namespace System;
using namespace System::CodeDom;
using namespace System::CodeDom::Compiler;
using namespace System::Collections;
using namespace System::ComponentModel;
using namespace System::Diagnostics;
using namespace System::Drawing;
using namespace System::IO;
using namespace System::Windows::Forms;
using namespace Microsoft::CSharp;
using namespace Microsoft::VisualBasic;
using namespace Microsoft::JScript;

// This example demonstrates building a Hello World program graph 
// using System.CodeDom elements. It calls code generator and
// code compiler methods to build the program using CSharp, VB, or
// JScript.  A Windows Forms interface is included. Note: Code
// must be compiled and linked with the Microsoft.JScript assembly. 
namespace CodeDOMExample {

  public __gc class CodeDomExample 
  {
    public:
        // Build a Hello World program graph using 
        // System::CodeDom types.
        static CodeCompileUnit *BuildHelloWorldGraph()
        {            
            // Create a new CodeCompileUnit to contain 
            // the program graph.
            CodeCompileUnit* compileUnit = new CodeCompileUnit();

            // Declare a new namespace called Samples.
            CodeNamespace* samples = new CodeNamespace(S"Samples");
            // Add the new namespace to the compile unit.
            compileUnit->Namespaces->Add(samples);

            // Add the new namespace import for the System namespace.
            samples->Imports->Add(new CodeNamespaceImport(S"System"));

            // Declare a new type called Class1.
            CodeTypeDeclaration* class1 = new CodeTypeDeclaration(S"Class1");
            // Add the new type to the namespace's type collection.
            samples->Types->Add(class1);

            // Declare a new code entry point method.
            CodeEntryPointMethod* start = new CodeEntryPointMethod();

            CodePrimitiveExpression *codePrimitive[] = new CodePrimitiveExpression*[1];

            // Create a type reference for the System::Console class.
            CodeTypeReferenceExpression *csSystemConsoleType = new CodeTypeReferenceExpression(S"System.Console");

            // Build a Console::WriteLine statement.
            codePrimitive[0] = new CodePrimitiveExpression(S"Hello World!");
            CodeMethodInvokeExpression* cs1 = new CodeMethodInvokeExpression(
                csSystemConsoleType, 
                S"WriteLine",
                static_cast<CodeExpression __gc * __gc[]>(codePrimitive)
                );

            // Add the WriteLine call to the statement collection.
            start->Statements->Add(cs1);

            // Build another Console::WriteLine statement.
            codePrimitive[0] = new CodePrimitiveExpression(S"Press the Enter key to continue.");
            CodeMethodInvokeExpression* cs2 = new CodeMethodInvokeExpression(
                csSystemConsoleType, 
                S"WriteLine",
                static_cast<CodeExpression __gc * __gc[]>(codePrimitive)
                );
            // Add the WriteLine call to the statement collection.
            start->Statements->Add(cs2);

            // Build a call to System::Console::ReadLine.
            CodeMethodReferenceExpression *csReadLine = new CodeMethodReferenceExpression(
                csSystemConsoleType, "ReadLine");

            CodeExpression *blankParms[] = new CodeExpression*[0];
            CodeMethodInvokeExpression *cs3 = new CodeMethodInvokeExpression(
                csReadLine, static_cast<CodeExpression __gc * __gc[]>(blankParms));

            // Add the ReadLine statement.
            start->Statements->Add(cs3);

            // Add the code entry point method to
            // the Members collection of the type.
            class1->Members->Add(start);

            return compileUnit;
        }

    public:
        static void GenerateCode(CodeDomProvider* provider, CodeCompileUnit* compileunit)
        {
            // Build the source file name with the appropriate
            // language extension.
            String *sourceFile;
            if (provider->FileExtension->StartsWith(S"."))
            {
                sourceFile = String::Concat(S"TestGraph", 
                    provider->FileExtension);
            }
            else 
            {
                sourceFile = String::Concat(S"TestGraph.", 
                    provider->FileExtension);
            }   

            // Obtain an ICodeGenerator* from the CodeDomProvider.
            ICodeGenerator* gen = provider->CreateGenerator();
            // Create an IndentedTextWriter, constructed with
            // a StreamWriter to the source file.
            IndentedTextWriter* tw = new IndentedTextWriter(new StreamWriter(sourceFile, false), S"    ");
            // Generate source code using the code generator.
            gen->GenerateCodeFromCompileUnit(compileunit, tw, new CodeGeneratorOptions());
            // Close the output file.
            tw->Close();
        }

    public:
        static CompilerResults * CompileCode(CodeDomProvider* provider, String* sourceFile, String *exeFile)
        {
            // Obtain an ICodeCompiler* from the CodeDomProvider.
            ICodeCompiler* compiler = provider->CreateCompiler();
            // Configure a CompilerParameters that links System.dll
            // and produces the specified executable file.
            String* referenceAssemblies [] = {S"System.dll"};
            CompilerParameters* cp = new CompilerParameters(referenceAssemblies, 
                exeFile, false);
            // Generate an executable rather than a DLL file.
            cp->GenerateExecutable = true;

            // Invoke compilation.
            CompilerResults* cr = compiler->CompileAssemblyFromFile(cp, sourceFile);
            // Return the results of compilation.
            return cr;
        }
  };

  public __gc class CodeDomExampleForm : public System::Windows::Forms::Form 
  {
    private:
        static System::Windows::Forms::Button* run_button = new System::Windows::Forms::Button();
    private:
        static System::Windows::Forms::Button* compile_button = new System::Windows::Forms::Button();
    private:
        static System::Windows::Forms::Button* generate_button = new System::Windows::Forms::Button();
    private:
        static System::Windows::Forms::TextBox* textBox1 = new System::Windows::Forms::TextBox();
    private:
        static System::Windows::Forms::ComboBox* comboBox1 = new System::Windows::Forms::ComboBox();
    private:
        static System::Windows::Forms::Label* label1 = new System::Windows::Forms::Label();
 
    private:
        void generate_button_Click(Object* /*sender*/, System::EventArgs* /*e*/) 
        {
            CodeDomProvider* provider = GetCurrentProvider();
            CodeDomExample::GenerateCode(provider, CodeDomExample::BuildHelloWorldGraph());

            // Build the source file name with the appropriate
            // language extension.
            String *sourceFile;
            if (provider->FileExtension->StartsWith(S"."))
            {
                sourceFile = String::Concat(S"TestGraph", 
                    provider->FileExtension);
            }
            else 
            {
                sourceFile = String::Concat(S"TestGraph.", 
                    provider->FileExtension);
            }   

            // Read in the generated source file and
            // display the source text.
            StreamReader* sr = new StreamReader(sourceFile);
            textBox1->Text = sr->ReadToEnd();
            sr->Close();
        }

    private:
        CodeDomProvider * GetCurrentProvider() 
        {
            CodeDomProvider* provider;
            if ( String::Compare(dynamic_cast<String*>(this->comboBox1->SelectedItem), S"CSharp") == 0 )
                provider = new CSharpCodeProvider();
            else if ( String::Compare(dynamic_cast<String*>(this->comboBox1->SelectedItem), S"Visual Basic") == 0 )
                provider = new VBCodeProvider();
            else if ( String::Compare(dynamic_cast<String*>(this->comboBox1->SelectedItem), S"JScript") == 0 )
                provider = new JScriptCodeProvider();
            else
                provider = new CSharpCodeProvider();
            return provider;
        }

    private:
        void compile_button_Click(Object* /*sender*/, System::EventArgs* /*e*/) 
        {
            CodeDomProvider* provider = GetCurrentProvider();

            // Build the source file name with the appropriate
            // language extension.
            String *sourceFile = String::Concat(S"TestGraph.", provider->FileExtension);

            // Compile the source file into an executable output file.
            CompilerResults* cr = CodeDomExample::CompileCode(provider, sourceFile, S"TestGraph.exe");

            if (cr->Errors->Count > 0) 
            {
                // Display compilation errors.
                textBox1->Text = String::Concat(S"Errors encountered while building ",
                    sourceFile, S" into ", cr->PathToAssembly, S": \r\n\n");
                System::CodeDom::Compiler::CompilerError* ce;
                for (int i=0; i<cr->Errors->Count; i++)
                {
                    ce = cr->Errors->get_Item(i);
 
                    textBox1->AppendText(String::Concat(ce->ToString(), S"\r\n"));
                }
                run_button->Enabled = false;

            } else {

                textBox1->Text = String::Concat(S"Source ", sourceFile, S" built into ",
                    cr->PathToAssembly, S" with no errors.");

                run_button->Enabled = true;
            }
        }

    private:
        void run_button_Click(Object* /*sender*/, System::EventArgs* /*e*/) 
        {
            Process::Start(S"TestGraph.exe");
        }

    public:
        CodeDomExampleForm() 
        {
            this->SuspendLayout();
            // Set properties for label1.
            this->label1->Location = System::Drawing::Point(395, 20);
            this->label1->Size =  System::Drawing::Size(180, 22);
            this->label1->Text = S"Select a programming language:";
            // Set properties for comboBox1.
            this->comboBox1->Location = System::Drawing::Point(560, 16);
            this->comboBox1->Size = System::Drawing::Size(190, 23);
            this->comboBox1->Name = S"comboBox1";
            String* temp1 [] = {S"CSharp", S"Visual Basic", S"JScript" };
            this->comboBox1->Items->AddRange(temp1);
            this->comboBox1->Anchor = (System::Windows::Forms::AnchorStyles)(System::Windows::Forms::AnchorStyles::Left |
                System::Windows::Forms::AnchorStyles::Right | System::Windows::Forms::AnchorStyles::Top);
            this->comboBox1->SelectedIndex = 0;
            // Set properties for generate_button.
            this->generate_button->Location = System::Drawing::Point(8, 16);
            this->generate_button->Name = S"generate_button";
            this->generate_button->Size =  System::Drawing::Size(120, 23);
            this->generate_button->Text = S"Generate Code";
            this->generate_button->Click += new System::EventHandler(this, &CodeDomExampleForm::generate_button_Click);
            // Set properties for compile_button.
            this->compile_button->Location = System::Drawing::Point(136, 16);
            this->compile_button->Name = S"compile_button";
            this->compile_button->Size = System::Drawing::Size(120, 23);
            this->compile_button->Text = S"Compile";
            this->compile_button->Click += new System::EventHandler(this, &CodeDomExampleForm::compile_button_Click);
            // Set properties for run_button.
            this->run_button->Enabled = false;
            this->run_button->Location = System::Drawing::Point(264, 16);
            this->run_button->Name = S"run_button";
            this->run_button->Size = System::Drawing::Size(120, 23);
            this->run_button->Text = S"Run";
            this->run_button->Click += new System::EventHandler(this, &CodeDomExampleForm::run_button_Click);
            // Set properties for textBox1.
            this->textBox1->Anchor = (System::Windows::Forms::AnchorStyles)(System::Windows::Forms::AnchorStyles::Top | System::Windows::Forms::AnchorStyles::Bottom
                | System::Windows::Forms::AnchorStyles::Left
                | System::Windows::Forms::AnchorStyles::Right);
            this->textBox1->Location = System::Drawing::Point(8, 48);
            this->textBox1->Multiline = true;
            this->textBox1->ScrollBars = System::Windows::Forms::ScrollBars::Vertical;
            this->textBox1->Name = S"textBox1";
            this->textBox1->Size = System::Drawing::Size(744, 280);
            this->textBox1->Text = S"";
            // Set properties for the CodeDomExampleForm.
            this->AutoScaleBaseSize = System::Drawing::Size(5, 13);
            this->ClientSize = System::Drawing::Size(768, 340);
            this->MinimumSize = System::Drawing::Size(750, 340);
            System::Windows::Forms::Control* myControl[] = {this->textBox1, 
                this->run_button, this->compile_button,
                this->generate_button, this->comboBox1, this->label1};
            this->Controls->AddRange(myControl);
            this->Name = S"CodeDomExampleForm";
            this->Text = S"CodeDom Hello World Example";
            this->ResumeLayout(false);
        }

    protected:
        void Dispose(bool disposing) 
        {
            __super::Dispose(disposing);
        }
  };
}

[STAThread]
int main() 
{
    Application::Run(new CodeDOMExample::CodeDomExampleForm());
}

[JScript] JScript のサンプルはありません。Visual Basic、C#、および C++ のサンプルを表示するには、このページの左上隅にある言語のフィルタ ボタン 言語のフィルタ をクリックします。

必要条件

名前空間: System.CodeDom.Compiler

プラットフォーム: Windows 98, Windows NT 4.0, Windows Millennium Edition, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003 ファミリ

アセンブリ: System (System.dll 内)

参照

CodeDomProvider メンバ | System.CodeDom.Compiler 名前空間