CodeDomProvider Klasa

Definicja

Udostępnia klasę bazową dla CodeDomProvider implementacji.Provides a base class for CodeDomProvider implementations. Ta klasa jest abstrakcyjna.This class is abstract.

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
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 drukuje "Hello world" przy użyciu Console klasy.The following example program can generate and compile source code based on a CodeDOM model of a program that prints "Hello World" using the Console class. Podano interfejs użytkownika Windows Forms.A Windows Forms user interface is provided. Użytkownik może wybrać docelowy język programowania z kilku opcji: C#, Visual Basic i JScript.The user can select the target programming language from several selections: C#, Visual Basic, and 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

Uwagi

A CodeDomProvider może służyć do tworzenia i pobierania wystąpień generatorów kodu i kompilatorów kodu.A CodeDomProvider can be used to create and retrieve instances of code generators and code compilers. 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.Code generators can be used to generate code in a particular language, and code compilers can be used to compile code into assemblies.

Uwaga

W .NET Framework 2,0 metody udostępnione w generatorze kodu i kompilatorze kodu są dostępne bezpośrednio od dostawcy kodu.In the .NET Framework 2.0, the methods made available in the code generator and code compiler are available directly from the code provider. Nie ma potrzeby wywoływania CreateGenerator lub CreateCompiler uzyskiwania dostępu do metod, a te metody są oznaczone jako przestarzałe.You do not need to call CreateGenerator or CreateCompiler to access the methods, and those methods are marked as obsolete. Dotyczy to zarówno istniejących, jak i nowych implementacji dostawców kodu.This applies to preexisting as well as new code provider implementations.

CodeDomProviderImplementacja zazwyczaj oferuje interfejsy generowania kodu i/lub kompilowania kodu do generowania kodu i zarządzania kompilacją dla jednego języka programowania.A CodeDomProvider implementation typically provides code generation and/or code compilation interfaces for generating code and managing compilation for a single programming language. Niektóre języki są obsługiwane przez CodeDomProvider implementacje, które są dostarczane z Windows SDK.Several languages are supported by CodeDomProvider implementations that ship with the Windows SDK. Języki te obejmują C#, Visual Basic, C++ i JScript.These languages include C#, Visual Basic, C++, and JScript. Deweloperzy lub dostawcy kompilatora mogą zaimplementować ICodeGenerator interfejsy i ICodeCompiler i zapewnić CodeDomProvider obsługę rozszerzania CodeDOM do innych języków programowania.Developers or compiler vendors can implement the ICodeGenerator and ICodeCompiler interfaces and provide a CodeDomProvider that extends CodeDOM support to other programming languages.

< > Element System. CodeDom w pliku konfiguracji komputera (Machine.config) zapewnia mechanizm dla deweloperów i dostawców kompilatora, aby dodać ustawienia konfiguracji dla dodatkowych CodeDomProvider implementacji.The <system.codedom> Element in the machine configuration file (Machine.config) provides a mechanism for developers and compiler vendors to add configuration settings for additional CodeDomProvider implementations.

CodeDomProviderKlasa zawiera metody statyczne do odnajdywania i wyliczania CodeDomProvider implementacji na komputerze.The CodeDomProvider class provides static methods to discover and enumerate the CodeDomProvider implementations on a computer. GetAllCompilerInfoMetoda zwraca ustawienia dla wszystkich CodeDomProvider implementacji na komputerze.The GetAllCompilerInfo method returns the settings for all CodeDomProvider implementations on a computer. GetCompilerInfoMetoda zwraca ustawienia dla konkretnej CodeDomProvider implementacji, na podstawie nazwy języka programowania.The GetCompilerInfo method returns the settings for a specific CodeDomProvider implementation, based on the programming language name. CreateProviderMetoda zwraca wystąpienie CodeDomProvider implementacji dla określonego języka.The CreateProvider method returns an instance of a CodeDomProvider implementation for a specific language.

Aby uzyskać więcej informacji na temat ustawień dostawcy języka w pliku konfiguracji, zobacz Schemat ustawień kompilatora i dostawcy języka.For more details on language provider settings in the configuration file, see Compiler and Language Provider Settings Schema.

Uwaga

Ta klasa wykonuje żądanie linku i żądanie dziedziczenia na poziomie klasy.This class makes a link demand and an inheritance demand at the class level. SecurityExceptionWystępuje, jeśli bezpośredni obiekt wywołujący lub Klasa pochodna nie ma uprawnienia pełnego zaufania.A SecurityException is thrown if either the immediate caller or the derived class does not have full trust permission. Aby uzyskać szczegółowe informacje o wymaganiach dotyczących zabezpieczeń, zobacz Wymagania dotyczące powiązań i wymagania dotyczące dziedziczenia.For details about security demands, see Link Demands and Inheritance Demands.

Uwagi dotyczące implementowania

W .NET Framework wersje 1,0 i 1,1 dostawcy kodu składają się z implementacji CodeDomProvider , ICodeGenerator , ICodeParser , i ICodeCompiler .In the .NET Framework versions 1.0 and 1.1, code providers consist of implementations of CodeDomProvider, ICodeGenerator, ICodeParser, and ICodeCompiler. W .NET Framework 2,0 CreateGenerator() CreateParser() metody, i CreateCompiler() są przestarzałe, a metody ICodeGenerator i ICodeCompiler są bezpośrednio dostępne w CodeDomProvider klasie.In the .NET Framework 2.0, the CreateGenerator(), CreateParser(), and CreateCompiler() methods are obsolete, and the methods of ICodeGenerator and ICodeCompiler are directly available in the CodeDomProvider class. Należy zastąpić te metody w implementacji dostawcy kodu i nie wywoływać metod podstawowych.You should override those methods in your code provider implementation and not call the base methods.

Konstruktory

CodeDomProvider()

Inicjuje nowe wystąpienie klasy CodeDomProvider.Initializes a new instance of the CodeDomProvider class.

Właściwości

CanRaiseEvents

Pobiera wartość wskazującą, czy składnik może zgłosić zdarzenie.Gets a value indicating whether the component can raise an event.

(Odziedziczone po Component)
Container

Pobiera IContainer , który zawiera Component .Gets the IContainer that contains the Component.

(Odziedziczone po Component)
DesignMode

Pobiera wartość wskazującą, czy Component jest aktualnie w trybie projektowania.Gets a value that indicates whether the Component is currently in design mode.

(Odziedziczone po Component)
Events

Pobiera listę programów obsługi zdarzeń, które są dołączone do tego elementu Component .Gets the list of event handlers that are attached to this Component.

(Odziedziczone po Component)
FileExtension

Pobiera domyślne rozszerzenie nazwy pliku, które ma być używane dla plików kodu źródłowego w bieżącym języku.Gets the default file name extension to use for source code files in the current language.

LanguageOptions

Pobiera identyfikator funkcji języka.Gets a language features identifier.

Site

Pobiera lub ustawia wartość ISite Component .Gets or sets the ISite of the Component.

(Odziedziczone po Component)

Metody

CompileAssemblyFromDom(CompilerParameters, CodeCompileUnit[])

Kompiluje zestaw na podstawie System.CodeDom drzew zawartych w określonej tablicy CodeCompileUnit obiektów przy użyciu określonych ustawień kompilatora.Compiles an assembly based on the System.CodeDom trees contained in the specified array of CodeCompileUnit objects, using the specified compiler settings.

CompileAssemblyFromFile(CompilerParameters, String[])

Kompiluje zestaw z kodu źródłowego zawartego w określonych plikach przy użyciu określonych ustawień kompilatora.Compiles an assembly from the source code contained in the specified files, using the specified compiler settings.

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.Compiles an assembly from the specified array of strings containing source code, using the specified compiler settings.

CreateCompiler()
Nieaktualne.
Nieaktualne.

Gdy jest zastępowany w klasie pochodnej, tworzy nowy kompilator kodu.When overridden in a derived class, creates a new code compiler.

CreateEscapedIdentifier(String)

Tworzy identyfikator o zmienionym znaczeniu dla określonej wartości.Creates an escaped identifier for the specified value.

CreateGenerator()
Nieaktualne.
Nieaktualne.

Gdy jest zastępowany w klasie pochodnej, tworzy nowy generator kodu.When overridden in a derived class, creates a new code generator.

CreateGenerator(String)

Gdy jest zastępowany w klasie pochodnej, tworzy nowy generator kodu przy użyciu określonej nazwy pliku dla danych wyjściowych.When overridden in a derived class, creates a new code generator using the specified file name for output.

CreateGenerator(TextWriter)

Gdy jest zastępowany w klasie pochodnej, tworzy nowy generator kodu przy użyciu określonego TextWriter dla danych wyjściowych.When overridden in a derived class, creates a new code generator using the specified TextWriter for output.

CreateObjRef(Type)

Tworzy obiekt, który zawiera wszystkie istotne informacje wymagane do wygenerowania serwera proxy używanego do komunikacji z obiektem zdalnym.Creates an object that contains all the relevant information required to generate a proxy used to communicate with a remote object.

(Odziedziczone po MarshalByRefObject)
CreateParser()
Nieaktualne.
Nieaktualne.

Gdy jest zastępowany w klasie pochodnej, tworzy nowy parser kodu.When overridden in a derived class, creates a new code parser.

CreateProvider(String)

Pobiera CodeDomProvider wystąpienie dla określonego języka.Gets a CodeDomProvider instance for the specified language.

CreateProvider(String, IDictionary<String,String>)

Pobiera CodeDomProvider wystąpienie dla określonego języka i opcji dostawcy.Gets a CodeDomProvider instance for the specified language and provider options.

CreateValidIdentifier(String)

Tworzy prawidłowy identyfikator dla określonej wartości.Creates a valid identifier for the specified value.

Dispose()

Zwalnia wszelkie zasoby używane przez element Component.Releases all resources used by the Component.

(Odziedziczone po Component)
Dispose(Boolean)

Zwalnia zasoby niezarządzane używane przez element Component i opcjonalnie zwalnia zasoby zarządzane.Releases the unmanaged resources used by the Component and optionally releases the managed resources.

(Odziedziczone po Component)
Equals(Object)

Określa, czy dany obiekt jest taki sam, jak bieżący obiekt.Determines whether the specified object is equal to the current object.

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

Generuje kod dla określonej jednostki kompilacji Code Document Object Model (CodeDOM) i wysyła ją do określonego składnika zapisywania tekstu przy użyciu określonych opcji.Generates code for the specified Code Document Object Model (CodeDOM) compilation unit and sends it to the specified text writer, using the specified options.

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.Generates code for the specified Code Document Object Model (CodeDOM) expression and sends it to the specified text writer, using the specified options.

GenerateCodeFromMember(CodeTypeMember, TextWriter, CodeGeneratorOptions)

Generuje kod dla określonej deklaracji składowej Code Document Object Model (CodeDOM) i wysyła ją do określonego składnika zapisywania tekstu przy użyciu określonych opcji.Generates code for the specified Code Document Object Model (CodeDOM) member declaration and sends it to the specified text writer, using the specified options.

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.Generates code for the specified Code Document Object Model (CodeDOM) namespace and sends it to the specified text writer, using the specified options.

GenerateCodeFromStatement(CodeStatement, TextWriter, CodeGeneratorOptions)

Generuje kod dla określonej instrukcji Code Document Object Model (CodeDOM) i wysyła ją do określonego składnika zapisywania tekstu przy użyciu określonych opcji.Generates code for the specified Code Document Object Model (CodeDOM) statement and sends it to the specified text writer, using the specified options.

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.Generates code for the specified Code Document Object Model (CodeDOM) type declaration and sends it to the specified text writer, using the specified options.

GetAllCompilerInfo()

Zwraca ustawienia dostawcy języka i konfiguracji kompilatora dla tego komputera.Returns the language provider and compiler configuration settings for this computer.

GetCompilerInfo(String)

Zwraca ustawienia dostawcy języka i konfiguracji kompilatora dla określonego języka.Returns the language provider and compiler configuration settings for the specified language.

GetConverter(Type)

Pobiera TypeConverter dla określonego typu danych.Gets a TypeConverter for the specified data type.

GetHashCode()

Służy jako domyślna funkcja skrótu.Serves as the default hash function.

(Odziedziczone po Object)
GetLanguageFromExtension(String)

Zwraca nazwę języka skojarzoną z określonym rozszerzeniem nazwy pliku, zgodnie z konfiguracją w CodeDomProvider sekcji konfiguracja kompilatora.Returns a language name associated with the specified file name extension, as configured in the CodeDomProvider compiler configuration section.

GetLifetimeService()
Nieaktualne.

Pobiera bieżący obiekt usługi okresu istnienia, który kontroluje zasady okresu istnienia dla tego wystąpienia.Retrieves the current lifetime service object that controls the lifetime policy for this instance.

(Odziedziczone po MarshalByRefObject)
GetService(Type)

Zwraca obiekt, który reprezentuje usługę dostarczoną przez Component lub przez Container .Returns an object that represents a service provided by the Component or by its Container.

(Odziedziczone po Component)
GetType()

Pobiera Type bieżące wystąpienie.Gets the Type of the current instance.

(Odziedziczone po Object)
GetTypeOutput(CodeTypeReference)

Pobiera typ wskazany przez określony CodeTypeReference .Gets the type indicated by the specified CodeTypeReference.

InitializeLifetimeService()
Nieaktualne.

Uzyskuje obiekt usługi istnienia w celu kontrolowania zasad okresu istnienia dla tego wystąpienia.Obtains a lifetime service object to control the lifetime policy for this instance.

(Odziedziczone po MarshalByRefObject)
IsDefinedExtension(String)

Sprawdza, czy rozszerzenie nazwy pliku ma skojarzoną CodeDomProvider implementację skonfigurowaną na komputerze.Tests whether a file name extension has an associated CodeDomProvider implementation configured on the computer.

IsDefinedLanguage(String)

Sprawdza, czy CodeDomProvider na komputerze jest skonfigurowana implementacja.Tests whether a language has a CodeDomProvider implementation configured on the computer.

IsValidIdentifier(String)

Zwraca wartość wskazującą, czy określona wartość jest prawidłowym identyfikatorem bieżącego języka.Returns a value that indicates whether the specified value is a valid identifier for the current language.

MemberwiseClone()

Tworzy skróconą kopię bieżącego elementu Object .Creates a shallow copy of the current Object.

(Odziedziczone po Object)
MemberwiseClone(Boolean)

Tworzy skróconą kopię bieżącego MarshalByRefObject obiektu.Creates a shallow copy of the current MarshalByRefObject object.

(Odziedziczone po MarshalByRefObject)
Parse(TextReader)

Kompiluje kod odczytywany z określonego strumienia tekstu do CodeCompileUnit .Compiles the code read from the specified text stream into a CodeCompileUnit.

Supports(GeneratorSupport)

Zwraca wartość wskazującą, czy podano określoną obsługę generowania kodu.Returns a value indicating whether the specified code generation support is provided.

ToString()

Zwraca wartość String zawierającą nazwę Component (jeśli istnieje).Returns a String containing the name of the Component, if any. Ta metoda nie powinna być przesłaniana.This method should not be overridden.

(Odziedziczone po Component)

Zdarzenia

Disposed

Występuje, gdy składnik zostanie usunięty przez wywołanie Dispose() metody.Occurs when the component is disposed by a call to the Dispose() method.

(Odziedziczone po Component)

Dotyczy

Zobacz też