Przeczytaj w języku angielskim

Udostępnij za pośrednictwem


CodeDomProvider Klasa

Definicja

Udostępnia klasę bazową na potrzeby CodeDomProvider implementacji. Ta klasa jest abstrakcyjna.

C#
public abstract class CodeDomProvider : System.ComponentModel.Component
C#
[System.Runtime.InteropServices.ComVisible(true)]
public abstract class CodeDomProvider : System.ComponentModel.Component
Dziedziczenie
Pochodne
Atrybuty

Przykłady

Poniższy przykładowy program może generować i kompilować kod źródłowy na podstawie modelu CodeDOM programu, który wyświetla kod "Hello World" przy użyciu Console klasy . Udostępniono interfejs użytkownika formularzy systemu Windows. Użytkownik może wybrać docelowy język programowania z kilku opcji: C#, Visual Basic i JScript.

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

Uwagi

Element CodeDomProvider może służyć do tworzenia i pobierania wystąpień generatorów kodu i kompilatorów kodu. Generatory kodu mogą służyć do generowania kodu w określonym języku, a kompilatory kodu mogą służyć do kompilowania kodu do zestawów.

Uwaga

W programie .NET Framework 2.0 metody udostępnione w generatorze kodu i kompilatorze kodu są dostępne bezpośrednio od dostawcy kodu. Nie trzeba wywoływać CreateGenerator metod ani CreateCompiler uzyskiwać do nich dostępu, a te metody są oznaczone jako przestarzałe. Dotyczy to istniejących, a także nowych implementacji dostawcy kodu.

Implementacja CodeDomProvider zwykle zapewnia interfejsy generowania kodu i/lub kompilacji kodu do generowania kodu i zarządzania kompilacją dla pojedynczego języka programowania. Kilka języków jest obsługiwanych przez CodeDomProvider implementacje dostarczane z zestawem Windows SDK. Te języki obejmują języki C#, Visual Basic, C++i JScript. Deweloperzy lub dostawcy kompilatora mogą implementować ICodeGenerator interfejsy i ICodeCompiler i zapewniać rozszerzenie CodeDomProvider obsługi CodeDOM na inne języki programowania.

Element< system.codedom> w pliku konfiguracji maszyny (Machine.config) udostępnia mechanizm dla deweloperów i dostawców kompilatora w celu dodania ustawień konfiguracji dla dodatkowych CodeDomProvider implementacji.

Klasa CodeDomProvider udostępnia metody statyczne do odnajdywania i wyliczania CodeDomProvider implementacji na komputerze. Metoda GetAllCompilerInfo zwraca ustawienia dla wszystkich CodeDomProvider implementacji na komputerze. Metoda GetCompilerInfo zwraca ustawienia dla określonej CodeDomProvider implementacji na podstawie nazwy języka programowania. Metoda CreateProvider zwraca wystąpienie implementacji CodeDomProvider dla określonego języka.

Aby uzyskać więcej informacji na temat ustawień dostawcy języka w pliku konfiguracji, zobacz Schemat ustawień kompilatora i dostawcy języka.

Uwaga

Ta klasa sprawia, że żądanie łącza i zapotrzebowanie na dziedziczenie na poziomie klasy. Obiekt SecurityException jest zgłaszany, jeśli bezpośredni obiekt wywołujący lub klasa pochodna nie ma pełnych uprawnień zaufania. Aby uzyskać szczegółowe informacje na temat wymagań dotyczących zabezpieczeń, zobacz Link Demands and Inheritance Demands (Wymagania dotyczące linków i żądań dziedziczenia).

Uwagi dotyczące implementowania

W programie .NET Framework w wersji 1.0 i 1.1 dostawcy kodu składają się z implementacji CodeDomProviderelementów , , ICodeGeneratorICodeParseri ICodeCompiler. W programie .NET Framework 2.0 CreateGenerator()metody , CreateParser()i CreateCompiler() są przestarzałe, a metody ICodeGenerator i ICodeCompiler są dostępne bezpośrednio w CodeDomProvider klasie . Należy zastąpić te metody w implementacji dostawcy kodu i nie wywoływać metod podstawowych.

Konstruktory

CodeDomProvider()

Inicjuje nowe wystąpienie klasy CodeDomProvider.

Właściwości

CanRaiseEvents

Pobiera wartość wskazującą, czy składnik może zgłosić zdarzenie.

(Odziedziczone po Component)
Container

Pobiera element IContainer zawierający element Component.

(Odziedziczone po Component)
DesignMode

Pobiera wartość wskazującą, czy Component element jest obecnie w trybie projektowania.

(Odziedziczone po Component)
Events

Pobiera listę programów obsługi zdarzeń dołączonych do tego Componentelementu .

(Odziedziczone po Component)
FileExtension

Pobiera domyślne rozszerzenie nazwy pliku do użycia dla plików kodu źródłowego w bieżącym języku.

LanguageOptions

Pobiera identyfikator funkcji języka.

Site

Pobiera lub ustawia wartość ISite .Component

(Odziedziczone po Component)

Metody

CompileAssemblyFromDom(CompilerParameters, CodeCompileUnit[])

Kompiluje zestaw na System.CodeDom podstawie drzew zawartych w określonej tablicy CodeCompileUnit obiektów przy użyciu określonych ustawień kompilatora.

CompileAssemblyFromFile(CompilerParameters, String[])

Kompiluje zestaw z kodu źródłowego zawartego w określonych plikach przy użyciu określonych ustawień kompilatora.

CompileAssemblyFromSource(CompilerParameters, String[])

Kompiluje zestaw z określonej tablicy ciągów zawierających kod źródłowy przy użyciu określonych ustawień kompilatora.

CreateCompiler()
Przestarzałe.
Przestarzałe.

Po zastąpieniu w klasie pochodnej tworzy nowy kompilator kodu.

CreateEscapedIdentifier(String)

Tworzy identyfikator ucieczki dla określonej wartości.

CreateGenerator()
Przestarzałe.
Przestarzałe.

Po przesłonięciu w klasie pochodnej tworzy nowy generator kodu.

CreateGenerator(String)

Po zastąpieniu w klasie pochodnej tworzy nowy generator kodu przy użyciu określonej nazwy pliku dla danych wyjściowych.

CreateGenerator(TextWriter)

Po zastąpieniu w klasie pochodnej tworzy nowy generator kodu przy użyciu określonego TextWriter dla danych wyjściowych.

CreateObjRef(Type)

Tworzy obiekt zawierający wszystkie istotne informacje wymagane do wygenerowania serwera proxy używanego do komunikowania się z obiektem zdalnym.

(Odziedziczone po MarshalByRefObject)
CreateParser()
Przestarzałe.
Przestarzałe.

Po przesłonięciu w klasie pochodnej program tworzy nowy analizator kodu.

CreateProvider(String)

CodeDomProvider Pobiera wystąpienie dla określonego języka.

CreateProvider(String, IDictionary<String,String>)

CodeDomProvider Pobiera wystąpienie dla określonego języka i opcji dostawcy.

CreateValidIdentifier(String)

Tworzy prawidłowy identyfikator dla określonej wartości.

Dispose()

Zwalnia wszelkie zasoby używane przez element Component.

(Odziedziczone po Component)
Dispose(Boolean)

Zwalnia zasoby niezarządzane używane przez element Component i opcjonalnie zwalnia zasoby zarządzane.

(Odziedziczone po Component)
Equals(Object)

Określa, czy dany obiekt jest taki sam, jak bieżący obiekt.

(Odziedziczone po Object)
GenerateCodeFromCompileUnit(CodeCompileUnit, TextWriter, CodeGeneratorOptions)

Generuje kod dla określonej jednostki kompilacji Code Document Object Model (CodeDOM) i wysyła go do określonego składnika zapisywania tekstu przy użyciu określonych opcji.

GenerateCodeFromExpression(CodeExpression, TextWriter, CodeGeneratorOptions)

Generuje kod dla określonego wyrażenia Code Document Object Model (CodeDOM) i wysyła go do określonego składnika zapisywania tekstu przy użyciu określonych opcji.

GenerateCodeFromMember(CodeTypeMember, TextWriter, CodeGeneratorOptions)

Generuje kod dla określonej deklaracji elementu członkowskiego Code Document Object Model (CodeDOM) i wysyła go do określonego składnika zapisywania tekstu przy użyciu określonych opcji.

GenerateCodeFromNamespace(CodeNamespace, TextWriter, CodeGeneratorOptions)

Generuje kod dla określonej przestrzeni nazw Code Document Object Model (CodeDOM) i wysyła go do określonego składnika zapisywania tekstu przy użyciu określonych opcji.

GenerateCodeFromStatement(CodeStatement, TextWriter, CodeGeneratorOptions)

Generuje kod dla określonej instrukcji Code Document Object Model (CodeDOM) i wysyła go do określonego składnika zapisywania tekstu przy użyciu określonych opcji.

GenerateCodeFromType(CodeTypeDeclaration, TextWriter, CodeGeneratorOptions)

Generuje kod dla określonej deklaracji typu Code Document Object Model (CodeDOM) i wysyła go do określonego składnika zapisywania tekstu przy użyciu określonych opcji.

GetAllCompilerInfo()

Zwraca ustawienia konfiguracji dostawcy języka i kompilatora dla tego komputera.

GetCompilerInfo(String)

Zwraca ustawienia konfiguracji dostawcy języka i kompilatora dla określonego języka.

GetConverter(Type)

Pobiera wartość TypeConverter dla określonego typu danych.

GetHashCode()

Służy jako domyślna funkcja skrótu.

(Odziedziczone po Object)
GetLanguageFromExtension(String)

Zwraca nazwę języka skojarzona z określonym rozszerzeniem nazwy pliku zgodnie z konfiguracją kompilatora CodeDomProvider .

GetLifetimeService()
Przestarzałe.

Pobiera bieżący obiekt usługi okresu istnienia, który kontroluje zasady okresu istnienia dla tego wystąpienia.

(Odziedziczone po MarshalByRefObject)
GetService(Type)

Zwraca obiekt, który reprezentuje usługę dostarczaną przez Component obiekt lub przez element Container.

(Odziedziczone po Component)
GetType()

Type Pobiera wartość bieżącego wystąpienia.

(Odziedziczone po Object)
GetTypeOutput(CodeTypeReference)

Pobiera typ wskazany przez określony CodeTypeReferenceelement .

InitializeLifetimeService()
Przestarzałe.

Uzyskuje obiekt usługi okresu istnienia w celu kontrolowania zasad okresu istnienia dla tego wystąpienia.

(Odziedziczone po MarshalByRefObject)
IsDefinedExtension(String)

Sprawdza, czy rozszerzenie nazwy pliku ma skojarzona CodeDomProvider implementację skonfigurowaną na komputerze.

IsDefinedLanguage(String)

Sprawdza, czy język ma skonfigurowaną implementację CodeDomProvider na komputerze.

IsValidIdentifier(String)

Zwraca wartość wskazującą, czy określona wartość jest prawidłowym identyfikatorem bieżącego języka.

MemberwiseClone()

Tworzy płytkią kopię bieżącego Objectelementu .

(Odziedziczone po Object)
MemberwiseClone(Boolean)

Tworzy płytkią kopię bieżącego MarshalByRefObject obiektu.

(Odziedziczone po MarshalByRefObject)
Parse(TextReader)

Kompiluje kod odczytywany ze strumienia określonego tekstu do elementu CodeCompileUnit.

Supports(GeneratorSupport)

Zwraca wartość wskazującą, czy jest zapewniona obsługa generowania określonego kodu.

ToString()

Zwraca wartość String zawierającą nazwę Componentobiektu , jeśli istnieje. Ta metoda nie powinna być zastępowana.

(Odziedziczone po Component)

Zdarzenia

Disposed

Występuje, gdy składnik jest usuwany przez wywołanie Dispose() metody .

(Odziedziczone po Component)

Dotyczy

Produkt Wersje
.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

Zobacz też