CodeDomProvider Classe
Définition
Important
Certaines informations portent sur la préversion du produit qui est susceptible d’être en grande partie modifiée avant sa publication. Microsoft exclut toute garantie, expresse ou implicite, concernant les informations fournies ici.
Fournit une classe de base pour les implémentations de CodeDomProvider. Cette classe est abstraite.
public ref class CodeDomProvider abstract : System::ComponentModel::Component
public abstract class CodeDomProvider : System.ComponentModel.Component
[System.Runtime.InteropServices.ComVisible(true)]
public abstract class CodeDomProvider : System.ComponentModel.Component
type CodeDomProvider = class
inherit Component
[<System.Runtime.InteropServices.ComVisible(true)>]
type CodeDomProvider = class
inherit Component
Public MustInherit Class CodeDomProvider
Inherits Component
- Héritage
- Dérivé
- Attributs
Exemples
L’exemple de programme suivant peut générer et compiler du code source basé sur un modèle CodeDOM d’un programme qui imprime « Hello World » à l’aide de la Console classe . Une interface utilisateur Windows Forms est fournie. L’utilisateur peut sélectionner le langage de programmation cible parmi plusieurs sélections : C#, Visual Basic et JScript.
#using <System.Windows.Forms.dll>
#using <System.Drawing.dll>
#using <System.dll>
#using <Microsoft.JScript.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;
using namespace System::Security::Permissions;
// 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
{
[PermissionSet(SecurityAction::Demand, Name="FullTrust")]
public ref 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 = gcnew CodeCompileUnit;
// Declare a new namespace called Samples.
CodeNamespace^ samples = gcnew 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( gcnew CodeNamespaceImport( "System" ) );
// Declare a new type called Class1.
CodeTypeDeclaration^ class1 = gcnew CodeTypeDeclaration( "Class1" );
// Add the new type to the namespace's type collection.
samples->Types->Add( class1 );
// Declare a new code entry point method.
CodeEntryPointMethod^ start = gcnew CodeEntryPointMethod;
// Create a type reference for the System::Console class.
CodeTypeReferenceExpression^ csSystemConsoleType = gcnew CodeTypeReferenceExpression( "System.Console" );
// Build a Console::WriteLine statement.
CodeMethodInvokeExpression^ cs1 = gcnew CodeMethodInvokeExpression( csSystemConsoleType,"WriteLine", gcnew CodePrimitiveExpression("Hello World!") );
// Add the WriteLine call to the statement collection.
start->Statements->Add( cs1 );
// Build another Console::WriteLine statement.
CodeMethodInvokeExpression^ cs2 = gcnew CodeMethodInvokeExpression( csSystemConsoleType,"WriteLine", gcnew 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.
CodeMethodReferenceExpression^ csReadLine = gcnew CodeMethodReferenceExpression( csSystemConsoleType, "ReadLine" );
CodeMethodInvokeExpression^ cs3 = gcnew CodeMethodInvokeExpression( csReadLine, gcnew array<CodeExpression^>(0) );
// 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;
}
static void GenerateCode( CodeDomProvider^ provider, CodeCompileUnit^ compileunit )
{
// Build the source file name with the appropriate
// language extension.
String^ sourceFile;
if ( provider->FileExtension->StartsWith( "." ) )
{
sourceFile = String::Concat( "TestGraph", provider->FileExtension );
}
else
{
sourceFile = String::Concat( "TestGraph.", provider->FileExtension );
}
// Create an IndentedTextWriter, constructed with
// a StreamWriter to the source file.
IndentedTextWriter^ tw = gcnew IndentedTextWriter( gcnew StreamWriter( sourceFile,false )," " );
// Generate source code using the code generator.
provider->GenerateCodeFromCompileUnit( compileunit, tw, gcnew CodeGeneratorOptions );
// Close the output file.
tw->Close();
}
static CompilerResults^ CompileCode( CodeDomProvider^ provider, String^ sourceFile, String^ exeFile )
{
// Configure a CompilerParameters that links System.dll
// and produces the specified executable file.
array<String^>^referenceAssemblies = {"System.dll"};
CompilerParameters^ cp = gcnew CompilerParameters( referenceAssemblies,exeFile,false );
// Generate an executable rather than a DLL file.
cp->GenerateExecutable = true;
// Invoke compilation.
CompilerResults^ cr = provider->CompileAssemblyFromFile( cp, sourceFile );
// Return the results of compilation.
return cr;
}
};
public ref class CodeDomExampleForm: public System::Windows::Forms::Form
{
private:
static System::Windows::Forms::Button^ run_button = gcnew System::Windows::Forms::Button;
static System::Windows::Forms::Button^ compile_button = gcnew System::Windows::Forms::Button;
static System::Windows::Forms::Button^ generate_button = gcnew System::Windows::Forms::Button;
static System::Windows::Forms::TextBox^ textBox1 = gcnew System::Windows::Forms::TextBox;
static System::Windows::Forms::ComboBox^ comboBox1 = gcnew System::Windows::Forms::ComboBox;
static System::Windows::Forms::Label^ label1 = gcnew System::Windows::Forms::Label;
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( "." ) )
{
sourceFile = String::Concat( "TestGraph", provider->FileExtension );
}
else
{
sourceFile = String::Concat( "TestGraph.", provider->FileExtension );
}
// Read in the generated source file and
// display the source text.
StreamReader^ sr = gcnew StreamReader( sourceFile );
textBox1->Text = sr->ReadToEnd();
sr->Close();
}
CodeDomProvider^ GetCurrentProvider()
{
CodeDomProvider^ provider;
if ( String::Compare( dynamic_cast<String^>(this->comboBox1->SelectedItem), "CSharp" ) == 0 )
provider = CodeDomProvider::CreateProvider("CSharp");
else
if ( String::Compare( dynamic_cast<String^>(this->comboBox1->SelectedItem), "Visual Basic" ) == 0 )
provider = CodeDomProvider::CreateProvider("VisualBasic");
else
if ( String::Compare( dynamic_cast<String^>(this->comboBox1->SelectedItem), "JScript" ) == 0 )
provider = CodeDomProvider::CreateProvider("JScript");
else
provider = CodeDomProvider::CreateProvider("CSharp");
return provider;
}
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( "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 = String::Concat( "Errors encountered while building ", sourceFile, " into ", cr->PathToAssembly, ": \r\n\n" );
System::CodeDom::Compiler::CompilerError^ ce;
for ( int i = 0; i < cr->Errors->Count; i++ )
{
ce = cr->Errors[i];
textBox1->AppendText( String::Concat( ce->ToString(), "\r\n" ) );
}
run_button->Enabled = false;
}
else
{
textBox1->Text = String::Concat( "Source ", sourceFile, " built into ", cr->PathToAssembly, " with no errors." );
run_button->Enabled = true;
}
}
void run_button_Click( Object^ /*sender*/, System::EventArgs^ /*e*/ )
{
Process::Start( "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 = "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 = "comboBox1";
array<String^>^temp1 = {"CSharp","Visual Basic","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 = "generate_button";
this->generate_button->Size = System::Drawing::Size( 120, 23 );
this->generate_button->Text = "Generate Code";
this->generate_button->Click += gcnew 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 = "compile_button";
this->compile_button->Size = System::Drawing::Size( 120, 23 );
this->compile_button->Text = "Compile";
this->compile_button->Click += gcnew 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 = "run_button";
this->run_button->Size = System::Drawing::Size( 120, 23 );
this->run_button->Text = "Run";
this->run_button->Click += gcnew 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 = "textBox1";
this->textBox1->Size = System::Drawing::Size( 744, 280 );
this->textBox1->Text = "";
// 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 );
array<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 = "CodeDomExampleForm";
this->Text = "CodeDom Hello World Example";
this->ResumeLayout( false );
}
public:
~CodeDomExampleForm()
{
}
};
}
[STAThread]
int main()
{
Application::Run( gcnew CodeDOMExample::CodeDomExampleForm );
}
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
{
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;
}
// 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.
provider.GenerateCodeFromCompileUnit(compileunit, tw, new CodeGeneratorOptions());
// Close the output file.
tw.Close();
}
public static CompilerResults CompileCode(CodeDomProvider provider,
String sourceFile,
String exeFile)
{
// 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 = provider.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 = CodeDomProvider.CreateProvider("CSharp");
break;
case "Visual Basic":
provider = CodeDomProvider.CreateProvider("VisualBasic");
break;
case "JScript":
provider = CodeDomProvider.CreateProvider("JScript");
break;
default:
provider = CodeDomProvider.CreateProvider("CSharp");
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());
}
}
}
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.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
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(".") Then
sourceFile = "TestGraph" + provider.FileExtension
Else
sourceFile = "TestGraph." + provider.FileExtension
End If
' 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.
provider.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
' 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 = provider.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(".") Then
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(".") Then
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 = CodeDomProvider.CreateProvider("CSharp")
Case "Visual Basic"
provider = CodeDomProvider.CreateProvider("VisualBasic")
Case "JScript"
provider = CodeDomProvider.CreateProvider("JScript")
Case Else
provider = CodeDomProvider.CreateProvider("CSharp")
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
Remarques
Un CodeDomProvider peut être utilisé pour créer et récupérer des instances de générateurs de code et de compilateurs de code. Les générateurs de code permettent de générer du code dans un langage donné, tandis que les compilateurs de code permettent de compiler du code dans des assemblys.
Notes
Dans .NET Framework 2.0, les méthodes mises à disposition dans le générateur de code et le compilateur de code sont disponibles directement à partir du fournisseur de code. Vous n’avez pas besoin d’appeler CreateGenerator ou CreateCompiler d’accéder aux méthodes, et ces méthodes sont marquées comme obsolètes. Cela s’applique aux implémentations préexistantes ainsi qu’aux nouvelles implémentations de fournisseur de code.
Une CodeDomProvider implémentation fournit généralement des interfaces de génération de code et/ou de compilation de code pour générer du code et gérer la compilation pour un seul langage de programmation. Plusieurs langages sont pris en charge par CodeDomProvider les implémentations fournies avec le KIT de développement logiciel (SDK) Windows. Ces langages incluent C#, Visual Basic, C++ et JScript. Les développeurs ou les fournisseurs de compilateurs peuvent implémenter les interfaces et ICodeCompiler et fournir un CodeDomProvider qui étend la ICodeGenerator prise en charge de CodeDOM à d’autres langages de programmation.
L’élément< system.codedom> dans le fichier de configuration de l’ordinateur (Machine.config) fournit un mécanisme permettant aux développeurs et aux fournisseurs de compilateurs d’ajouter des paramètres de configuration pour des implémentations supplémentairesCodeDomProvider.
La CodeDomProvider classe fournit des méthodes statiques pour découvrir et énumérer les CodeDomProvider implémentations sur un ordinateur. La GetAllCompilerInfo méthode retourne les paramètres de toutes les CodeDomProvider implémentations sur un ordinateur. La GetCompilerInfo méthode retourne les paramètres d’une implémentation spécifique CodeDomProvider , en fonction du nom du langage de programmation. La CreateProvider méthode retourne une instance d’une CodeDomProvider implémentation pour un langage spécifique.
Pour plus d’informations sur les paramètres du fournisseur de langage dans le fichier de configuration, consultez Schéma des paramètres du compilateur et du fournisseur de langage.
Notes
Cette classe effectue une demande de liaison et une demande d’héritage au niveau de la classe. A SecurityException est levée si l’appelant immédiat ou la classe dérivée n’a pas l’autorisation d’approbation totale. Pour plus d’informations sur les demandes de sécurité, consultez Demandes de liaison et demandes d’héritage.
Notes pour les responsables de l’implémentation
Dans les versions 1.0 et 1.1 du .NET Framework, les fournisseurs de code se composent d’implémentations de CodeDomProvider, ICodeGenerator, ICodeParseret ICodeCompiler. Dans .NET Framework 2.0, les CreateGenerator()méthodes , CreateParser()et CreateCompiler() sont obsolètes et les méthodes de ICodeGenerator et ICodeCompiler sont directement disponibles dans la CodeDomProvider classe . Vous devez remplacer ces méthodes dans votre implémentation de fournisseur de code et ne pas appeler les méthodes de base.
Constructeurs
CodeDomProvider() |
Initialise une nouvelle instance de la classe CodeDomProvider. |
Propriétés
CanRaiseEvents |
Obtient une valeur qui indique si le composant peut déclencher un événement. (Hérité de Component) |
Container |
Obtient le IContainer qui contient la Component. (Hérité de Component) |
DesignMode |
Obtient une valeur qui indique si Component est actuellement en mode design. (Hérité de Component) |
Events |
Obtient la liste des gestionnaires d'événements attachés à ce Component. (Hérité de Component) |
FileExtension |
Définit l'extension du nom de fichier par défaut à utiliser pour les fichiers de code source dans le langage actuel. |
LanguageOptions |
Obtient un identificateur de fonctionnalités de langage. |
Site |
Obtient ou définit le ISite de Component. (Hérité de Component) |
Méthodes
CompileAssemblyFromDom(CompilerParameters, CodeCompileUnit[]) |
Compile un assembly basé sur les arborescences System.CodeDom contenues dans le tableau d'objets CodeCompileUnit spécifié, à l'aide des paramètres du compilateur spécifiés. |
CompileAssemblyFromFile(CompilerParameters, String[]) |
Compile un assembly à partir du code source contenu dans les fichiers spécifiés, à l'aide des paramètres du compilateur spécifiés. |
CompileAssemblyFromSource(CompilerParameters, String[]) |
Compile un assembly à partir du tableau de chaînes spécifié contenant le code source, à l'aide des paramètres du compilateur spécifiés. |
CreateCompiler() |
Obsolète.
Obsolète.
En cas de substitution dans une classe dérivée, crée un nouveau compilateur de code. |
CreateEscapedIdentifier(String) |
Crée un identificateur avec séquence d'échappement pour la valeur spécifiée. |
CreateGenerator() |
Obsolète.
Obsolète.
En cas de substitution dans une classe dérivée, crée un nouveau générateur de code. |
CreateGenerator(String) |
En cas de substitution dans une classe dérivée, crée un nouveau générateur de code à l'aide du nom de fichier spécifié pour la sortie. |
CreateGenerator(TextWriter) |
En cas de substitution dans une classe dérivée, crée un nouveau générateur de code à l'aide du TextWriter spécifié pour la sortie. |
CreateObjRef(Type) |
Crée un objet contenant toutes les informations appropriées requises pour générer un proxy permettant de communiquer avec un objet distant. (Hérité de MarshalByRefObject) |
CreateParser() |
Obsolète.
Obsolète.
En cas de substitution dans une classe dérivée, crée un nouvel analyseur de code. |
CreateProvider(String) |
Crée une instance de CodeDomProvider pour le langage spécifié. |
CreateProvider(String, IDictionary<String,String>) |
Obtient une instance CodeDomProvider pour le langage et les options de fournisseur spécifiés. |
CreateValidIdentifier(String) |
Crée un identificateur valide pour la valeur spécifiée. |
Dispose() |
Libère toutes les ressources utilisées par Component. (Hérité de Component) |
Dispose(Boolean) |
Libère les ressources non managées utilisées par Component et libère éventuellement les ressources managées. (Hérité de Component) |
Equals(Object) |
Détermine si l'objet spécifié est égal à l'objet actuel. (Hérité de Object) |
GenerateCodeFromCompileUnit(CodeCompileUnit, TextWriter, CodeGeneratorOptions) |
Génère du code pour l'unité de compilation CodeDOM (Code Document Object Model) spécifiée et l'envoie au writer de texte spécifié, à l'aide des options définies. |
GenerateCodeFromExpression(CodeExpression, TextWriter, CodeGeneratorOptions) |
Génère du code pour l'expression CodeDOM (Code Document Object Model) spécifiée et l'envoie au writer de texte spécifié, à l'aide des options définies. |
GenerateCodeFromMember(CodeTypeMember, TextWriter, CodeGeneratorOptions) |
Génère du code pour la déclaration de membre CodeDOM (Code Document Object Model) spécifiée et l'envoie au writer de texte spécifié, à l'aide des options définies. |
GenerateCodeFromNamespace(CodeNamespace, TextWriter, CodeGeneratorOptions) |
Génère du code pour l'espace de noms CodeDOM (Code Document Object Model) spécifié et l'envoie au writer de texte spécifié, à l'aide des options définies. |
GenerateCodeFromStatement(CodeStatement, TextWriter, CodeGeneratorOptions) |
Génère du code pour l'instruction CodeDOM (Code Document Object Model) spécifiée et l'envoie au writer de texte spécifié, à l'aide des options définies. |
GenerateCodeFromType(CodeTypeDeclaration, TextWriter, CodeGeneratorOptions) |
Génère du code pour la déclaration de type CodeDOM (Code Document Object Model) spécifiée et l'envoie au writer de texte spécifié, à l'aide des options définies. |
GetAllCompilerInfo() |
Retourne le fournisseur de langages et les paramètres de configuration de compilateur pour cet ordinateur. |
GetCompilerInfo(String) |
Retourne le fournisseur de langages et les paramètres de configuration de compilateur pour le langage spécifié. |
GetConverter(Type) |
Obtient TypeConverter pour le type de données spécifié. |
GetHashCode() |
Fait office de fonction de hachage par défaut. (Hérité de Object) |
GetLanguageFromExtension(String) |
Retourne un nom de langage associé à l'extension de nom de fichier spécifiée, comme configuré dans la section de configuration de compilateur CodeDomProvider. |
GetLifetimeService() |
Obsolète.
Récupère l'objet de service de durée de vie en cours qui contrôle la stratégie de durée de vie de cette instance. (Hérité de MarshalByRefObject) |
GetService(Type) |
Retourne un objet qui représente un service fourni par Component ou par son Container. (Hérité de Component) |
GetType() |
Obtient le Type de l'instance actuelle. (Hérité de Object) |
GetTypeOutput(CodeTypeReference) |
Obtient le type indiqué par le CodeTypeReference spécifié. |
InitializeLifetimeService() |
Obsolète.
Obtient un objet de service de durée de vie pour contrôler la stratégie de durée de vie de cette instance. (Hérité de MarshalByRefObject) |
IsDefinedExtension(String) |
Vérifie si une implémentation de CodeDomProvider configurée sur l'ordinateur est associée à une extension de nom de fichier. |
IsDefinedLanguage(String) |
Vérifie si un langage dispose d'une implémentation de CodeDomProvider configurée sur l'ordinateur. |
IsValidIdentifier(String) |
Retourne une valeur indiquant si la valeur spécifiée est un identificateur valide pour le langage actuel. |
MemberwiseClone() |
Crée une copie superficielle du Object actuel. (Hérité de Object) |
MemberwiseClone(Boolean) |
Crée une copie superficielle de l'objet MarshalByRefObject actuel. (Hérité de MarshalByRefObject) |
Parse(TextReader) |
Compile le code lu à partir du flux de texte spécifié dans CodeCompileUnit. |
Supports(GeneratorSupport) |
Retourne une valeur indiquant si la prise en charge de la génération de code spécifiée est fournie. |
ToString() |
Retourne un String contenant le nom du Component, s’il en existe un. Cette méthode ne doit pas être remplacée. (Hérité de Component) |
Événements
Disposed |
Se produit lorsque le composant est supprimé par un appel à la méthode Dispose(). (Hérité de Component) |