Leggere in inglese

Condividi tramite


CodeDomProvider Classe

Definizione

Fornisce una classe base per le implementazioni di CodeDomProvider. Questa classe è astratta.

public abstract class CodeDomProvider : System.ComponentModel.Component
[System.Runtime.InteropServices.ComVisible(true)]
public abstract class CodeDomProvider : System.ComponentModel.Component
Ereditarietà
Derivato
Attributi

Esempio

Il programma di esempio seguente può generare e compilare codice sorgente in base a un modello CodeDOM di un programma che stampa "Hello World" usando la Console classe . Viene fornita un'interfaccia utente di Windows Form. L'utente può selezionare il linguaggio di programmazione di destinazione da diverse selezioni: C#, Visual Basic e JScript.

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());
        }
    }
}

Commenti

È possibile usare un oggetto CodeDomProvider per creare e recuperare istanze di generatori di codice e compilatori di codice. È possibile utilizzare i generatori di codice per generare codice in un linguaggio particolare e i compilatori di codice per compilare codice in assembly.

Nota

In .NET Framework 2.0 i metodi resi disponibili nel generatore di codice e nel compilatore di codice sono disponibili direttamente dal provider di codice. Non è necessario chiamare CreateGenerator o CreateCompiler accedere ai metodi e questi metodi sono contrassegnati come obsoleti. Questo vale per la preesistribuzione e le nuove implementazioni del provider di codice.

Un'implementazione CodeDomProvider fornisce in genere interfacce di compilazione di codice e/o di generazione di codice per la generazione di codice e la gestione della compilazione per un singolo linguaggio di programmazione. Diversi linguaggi sono supportati dalle CodeDomProvider implementazioni che vengono fornite con Windows SDK. Questi linguaggi includono C#, Visual Basic, C++ e JScript. Gli sviluppatori o i fornitori di compilatori possono implementare le ICodeGenerator interfacce e ICodeCompiler e fornire un'estensione CodeDomProvider del supporto codeDOM ad altri linguaggi di programmazione.

L'elemento< system.codedom> nel file di configurazione del computer (Machine.config) fornisce un meccanismo per sviluppatori e fornitori del compilatore per aggiungere impostazioni di configurazione per altre CodeDomProvider implementazioni.

La CodeDomProvider classe fornisce metodi statici per individuare ed enumerare le CodeDomProvider implementazioni in un computer. Il GetAllCompilerInfo metodo restituisce le impostazioni per tutte le CodeDomProvider implementazioni in un computer. Il GetCompilerInfo metodo restituisce le impostazioni per un'implementazione specifica CodeDomProvider , in base al nome del linguaggio di programmazione. Il CreateProvider metodo restituisce un'istanza di un'implementazione CodeDomProvider per un linguaggio specifico.

Per altre informazioni sulle impostazioni del provider di linguaggio nel file di configurazione, vedere Schema delle impostazioni del provider di linguaggio e del compilatore.

Nota

Questa classe rende una richiesta di collegamento e una richiesta di ereditarietà a livello di classe. Viene SecurityException generato se il chiamante immediato o la classe derivata non dispone dell'autorizzazione di attendibilità completa. Per informazioni dettagliate sulle richieste di sicurezza, vedere Collegare richieste e richieste di ereditarietà.

Note per gli implementatori

In .NET Framework versioni 1.0 e 1.1 i provider di codice sono costituiti da implementazioni di CodeDomProvider, ICodeGeneratorICodeParser, e ICodeCompiler. In .NET Framework 2.0 i CreateGenerator()metodi , e CreateParser()CreateCompiler() sono obsoleti e i metodi di ICodeGenerator e ICodeCompiler sono direttamente disponibili nella CodeDomProvider classe. È necessario eseguire l'override di questi metodi nell'implementazione del provider di codice e non chiamare i metodi di base.

Costruttori

CodeDomProvider()

Inizializza una nuova istanza della classe CodeDomProvider.

Proprietà

CanRaiseEvents

Ottiene un valore che indica se il componente può generare un evento.

(Ereditato da Component)
Container

Ottiene l'oggetto IContainer che contiene Component.

(Ereditato da Component)
DesignMode

Ottiene un valore che indica se il Component si trova in modalità progettazione.

(Ereditato da Component)
Events

Ottiene l'elenco dei gestori eventi allegati a questo Component.

(Ereditato da Component)
FileExtension

Ottiene l'estensione del nome file predefinita da utilizzare per i file di origine nel linguaggio corrente.

LanguageOptions

Ottiene un identificatore delle funzionalità del linguaggio.

Site

Ottiene o imposta l'oggetto ISite di Component.

(Ereditato da Component)

Metodi

CompileAssemblyFromDom(CompilerParameters, CodeCompileUnit[])

Compila un assembly in base alle strutture ad albero System.CodeDom contenute nella matrice di oggetti CodeCompileUnit specificata utilizzando le impostazioni del compilatore specificato.

CompileAssemblyFromFile(CompilerParameters, String[])

Compila un assembly dal codice sorgente contenuto nei file specificati, utilizzando le impostazioni del compilatore specificato.

CompileAssemblyFromSource(CompilerParameters, String[])

Compila un assembly dalla matrice di stringhe specificata contenente il codice sorgente utilizzando le impostazioni del compilatore specificato.

CreateCompiler()
Obsoleti.
Obsoleti.

Quando è sottoposto a override in una classe derivata, crea un nuovo compilatore di codice.

CreateEscapedIdentifier(String)

Crea un identificatore di escape per il valore specificato.

CreateGenerator()
Obsoleti.
Obsoleti.

Quando è sottoposto a override in una classe derivata, crea un nuovo generatore di codice.

CreateGenerator(String)

Quando è sottoposto a override in una classe derivata, crea un nuovo generatore di codice utilizzando per l'output il nome file specificato.

CreateGenerator(TextWriter)

Quando è sottoposto a override in una classe derivata, crea un nuovo generatore di codice utilizzando per l'output l'oggetto TextWriter specificato.

CreateObjRef(Type)

Consente di creare un oggetto che contiene tutte le informazioni rilevanti necessarie per la generazione del proxy utilizzato per effettuare la comunicazione con un oggetto remoto.

(Ereditato da MarshalByRefObject)
CreateParser()
Obsoleti.
Obsoleti.

Quando è sottoposto a override in una classe derivata, crea un nuovo parser di codice.

CreateProvider(String)

Ottiene un'istanza della classe CodeDomProvider per il linguaggio specificato.

CreateProvider(String, IDictionary<String,String>)

Ottiene un'istanza di CodeDomProvider per le opzioni della lingua e del provider specificate.

CreateValidIdentifier(String)

Crea un identificatore valido per il valore specificato.

Dispose()

Rilascia tutte le risorse usate da Component.

(Ereditato da Component)
Dispose(Boolean)

Rilascia le risorse non gestite usate da Component e, facoltativamente, le risorse gestite.

(Ereditato da Component)
Equals(Object)

Determina se l'oggetto specificato è uguale all'oggetto corrente.

(Ereditato da Object)
GenerateCodeFromCompileUnit(CodeCompileUnit, TextWriter, CodeGeneratorOptions)

Genera il codice per l'unità di compilazione CodeDOM (Code Document Object Model) specificata e lo invia al writer di testo indicato utilizzando le opzioni selezionate.

GenerateCodeFromExpression(CodeExpression, TextWriter, CodeGeneratorOptions)

Genera il codice per l'espressione CodeDOM (Code Document Object Model) specificata e lo invia al writer di testo indicato utilizzando le opzioni selezionate.

GenerateCodeFromMember(CodeTypeMember, TextWriter, CodeGeneratorOptions)

Genera il codice per la dichiarazione di membro CodeDOM (Code Document Object Model) specificata e lo invia al writer di testo indicato utilizzando le opzioni selezionate.

GenerateCodeFromNamespace(CodeNamespace, TextWriter, CodeGeneratorOptions)

Genera il codice per lo spazio dei nomi CodeDOM (Code Document Object Model) specificato e lo invia al writer di testo indicato utilizzando le opzioni selezionate.

GenerateCodeFromStatement(CodeStatement, TextWriter, CodeGeneratorOptions)

Genera il codice per l'istruzione CodeDOM (Code Document Object Model) specificata e lo invia al writer di testo indicato utilizzando le opzioni selezionate.

GenerateCodeFromType(CodeTypeDeclaration, TextWriter, CodeGeneratorOptions)

Genera il codice per la dichiarazione di tipo CodeDOM (Code Document Object Model) specificata e lo invia al writer di testo indicato utilizzando le opzioni selezionate.

GetAllCompilerInfo()

Restituisce le impostazioni di configurazione del compilatore e del provider del linguaggio per il computer.

GetCompilerInfo(String)

Restituisce le impostazioni di configurazione del compilatore e del provider del linguaggio per il linguaggio specificato.

GetConverter(Type)

Ottiene un TypeConverter per il tipo di dati specificato.

GetHashCode()

Funge da funzione hash predefinita.

(Ereditato da Object)
GetLanguageFromExtension(String)

Restituisce un nome di linguaggio associato all'estensione di file specificata, in base alle impostazioni nella sezione di configurazione del compilatore CodeDomProvider.

GetLifetimeService()
Obsoleti.

Consente di recuperare l'oggetto servizio di durata corrente per controllare i criteri di durata per l'istanza.

(Ereditato da MarshalByRefObject)
GetService(Type)

Consente di restituire un oggetto che rappresenta un servizio fornito da Component o dal relativo Container.

(Ereditato da Component)
GetType()

Ottiene l'oggetto Type dell'istanza corrente.

(Ereditato da Object)
GetTypeOutput(CodeTypeReference)

Ottiene il tipo indicato dall'oggetto CodeTypeReference specificato.

InitializeLifetimeService()
Obsoleti.

Ottiene un oggetto servizio di durata per controllare i criteri di durata per questa istanza.

(Ereditato da MarshalByRefObject)
IsDefinedExtension(String)

Verifica se un'estensione di file è associata a un'implementazione della classe CodeDomProvider configurata nel computer.

IsDefinedLanguage(String)

Verifica se per un linguaggio è configurata un'implementazione della classe CodeDomProvider nel computer.

IsValidIdentifier(String)

Restituisce un valore che indica se il valore specificato rappresenta un identificatore valido per il linguaggio corrente.

MemberwiseClone()

Crea una copia superficiale dell'oggetto Object corrente.

(Ereditato da Object)
MemberwiseClone(Boolean)

Crea una copia dei riferimenti dell'oggetto MarshalByRefObject corrente.

(Ereditato da MarshalByRefObject)
Parse(TextReader)

Compila il codice letto dal flusso di testo specificato in un oggetto CodeCompileUnit.

Supports(GeneratorSupport)

Restituisce un valore che indica se viene fornito il supporto per la generazione di codice specificato.

ToString()

Restituisce un oggetto String che contiene il nome dell'eventuale oggetto Component. Questo metodo non deve essere sottoposto a override.

(Ereditato da Component)

Eventi

Disposed

Si verifica quando il componente viene eliminato da una chiamata al metodo Dispose().

(Ereditato da Component)

Si applica a

Prodotto Versioni
.NET 6, 7, 8, 9
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.0
Windows Desktop 3.0, 3.1, 5, 6, 7, 8, 9

Vedi anche