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