Прочитать на английском

Поделиться через


CodeDomProvider Класс

Определение

Предоставляет базовый класс для реализаций CodeDomProvider. Это абстрактный класс.

public abstract class CodeDomProvider : System.ComponentModel.Component
[System.Runtime.InteropServices.ComVisible(true)]
public abstract class CodeDomProvider : System.ComponentModel.Component
Наследование
Производный
Атрибуты

Примеры

Следующий пример программы может создавать и компилировать исходный код на основе модели CodeDOM программы, которая выводит "Hello World" с помощью Console класса . Предоставляется пользовательский интерфейс Windows Forms. Пользователь может выбрать целевой язык программирования из нескольких вариантов: C#, Visual Basic и 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());
        }
    }
}

Комментарии

Можно CodeDomProvider использовать для создания и извлечения экземпляров генераторов кода и компиляторов кода. Генераторы кода применяются для создания кода на определенном языке, а компиляторы кода используются для компиляции кода в сборки.

Примечание

В .NET Framework 2.0 методы, доступные в генераторе кода и компиляторе кода, доступны непосредственно у поставщика кода. Вам не нужно вызывать CreateGenerator методы или CreateCompiler для доступа к этим методам, и эти методы помечены как устаревшие. Это относится как к уже существующим, так и к новым реализациям поставщика кода.

Реализация CodeDomProvider обычно предоставляет интерфейсы создания кода и компиляции кода для создания кода и управления компиляцией для одного языка программирования. Реализации, поставляемые CodeDomProvider с Windows SDK, поддерживают несколько языков. К этим языкам относятся C#, Visual Basic, C++ и JScript. Разработчики или поставщики компиляторов могут реализовать ICodeGenerator интерфейсы и и ICodeCompiler предоставить CodeDomProvider , который расширяет поддержку CodeDOM на другие языки программирования.

Элемент< system.codedom> в файле конфигурации компьютера (Machine.config) предоставляет разработчикам и поставщикам компиляторов механизм добавления параметров конфигурации для дополнительных CodeDomProvider реализаций.

Класс предоставляет статические CodeDomProvider методы для обнаружения и перечисления CodeDomProvider реализаций на компьютере. Метод GetAllCompilerInfo возвращает параметры для всех CodeDomProvider реализаций на компьютере. Метод GetCompilerInfo возвращает параметры для конкретной CodeDomProvider реализации на основе имени языка программирования. Метод CreateProvider возвращает экземпляр реализации для определенного CodeDomProvider языка.

Дополнительные сведения о параметрах поставщика языка в файле конфигурации см. в разделе Схема параметров компилятора и поставщика языка.

Примечание

Этот класс создает запрос на связь и требование наследования на уровне класса. Возникает SecurityException , если непосредственный вызывающий объект или производный класс не имеют разрешения на полное доверие. Дополнительные сведения о требованиях к безопасности см. в разделах Требования ссылок и Требования наследования.

Примечания для тех, кто реализует этот метод

В .NET Framework версий 1.0 и 1.1 поставщики кода состоят из реализаций CodeDomProvider, ICodeGenerator, ICodeParserи ICodeCompiler. В .NET Framework 2.0 CreateGenerator()методы , CreateParser()и CreateCompiler() устарели, а методы ICodeGenerator и доступны ICodeCompiler непосредственно в CodeDomProvider классе . Эти методы следует переопределить в реализации поставщика кода, а не вызывать базовые методы.

Конструкторы

CodeDomProvider()

Инициализирует новый экземпляр класса CodeDomProvider.

Свойства

CanRaiseEvents

Возвращает значение, показывающее, может ли компонент вызывать событие.

(Унаследовано от Component)
Container

Возвращает объект IContainer, который содержит коллекцию Component.

(Унаследовано от Component)
DesignMode

Возвращает значение, указывающее, находится ли данный компонент Component в режиме конструктора в настоящее время.

(Унаследовано от Component)
Events

Возвращает список обработчиков событий, которые прикреплены к этому объекту Component.

(Унаследовано от Component)
FileExtension

Получает расширение имени файла по умолчанию для использования в файлах исходного кода в текущем языке.

LanguageOptions

Получает идентификатор возможностей языка.

Site

Получает или задает ISite объекта Component.

(Унаследовано от Component)

Методы

CompileAssemblyFromDom(CompilerParameters, CodeCompileUnit[])

Компилирует сборку на основе деревьев System.CodeDom, содержащихся в указанном массиве объектов CodeCompileUnit, используя указанные параметры компилятора.

CompileAssemblyFromFile(CompilerParameters, String[])

Компилирует сборку из исходного кода, содержащегося в указанных файлах, используя указанные параметры компилятора.

CompileAssemblyFromSource(CompilerParameters, String[])

Компилирует сборку из указанного массива строк, содержащего исходный код, используя указанные параметры компилятора.

CreateCompiler()
Устаревшие..
Устаревшие..

При переопределении в производном классе создает новый компилятор кода.

CreateEscapedIdentifier(String)

Создает Escape-идентификатор для заданного значения.

CreateGenerator()
Устаревшие..
Устаревшие..

При переопределении в производном классе создает новый генератор кода.

CreateGenerator(String)

При переопределении в производном классе создает новый генератор кода, используя указанное имя файла для выходных данных.

CreateGenerator(TextWriter)

При переопределении в производном классе создает новый генератор кода, используя для вывода указанный объект TextWriter.

CreateObjRef(Type)

Создает объект, который содержит всю необходимую информацию для создания прокси-сервера, используемого для взаимодействия с удаленным объектом.

(Унаследовано от MarshalByRefObject)
CreateParser()
Устаревшие..
Устаревшие..

При переопределении в производном классе создает новый анализатор кода.

CreateProvider(String)

Получает экземпляр CodeDomProvider для заданного языка.

CreateProvider(String, IDictionary<String,String>)

Получает экземпляр CodeDomProvider для заданного языка и параметров поставщика.

CreateValidIdentifier(String)

Создает допустимый идентификатор для указанного значения.

Dispose()

Освобождает все ресурсы, занятые модулем Component.

(Унаследовано от Component)
Dispose(Boolean)

Освобождает неуправляемые ресурсы, используемые объектом Component, а при необходимости освобождает также управляемые ресурсы.

(Унаследовано от Component)
Equals(Object)

Определяет, равен ли указанный объект текущему объекту.

(Унаследовано от Object)
GenerateCodeFromCompileUnit(CodeCompileUnit, TextWriter, CodeGeneratorOptions)

Создает код для указанной единицы компиляции объектной модели документов кода (CodeDOM) и направляет его указанному модулю записи текста, используя заданные параметры.

GenerateCodeFromExpression(CodeExpression, TextWriter, CodeGeneratorOptions)

Создает код для указанного выражения объектной модели документов кода (CodeDOM) и направляет его указанному модулю записи текста, используя заданные параметры.

GenerateCodeFromMember(CodeTypeMember, TextWriter, CodeGeneratorOptions)

Создает код для указанного объявления члена объектной модели документов кода (CodeDOM) и направляет его указанному модулю записи текста, используя заданные параметры.

GenerateCodeFromNamespace(CodeNamespace, TextWriter, CodeGeneratorOptions)

Создает код для указанного пространства имен объектной модели документов кода (CodeDOM) и направляет его указанному модулю записи текста, используя заданные параметры.

GenerateCodeFromStatement(CodeStatement, TextWriter, CodeGeneratorOptions)

Создает код для указанного оператора языка объектной модели документов кода (CodeDOM) и направляет его указанному модулю записи текста, используя заданные параметры.

GenerateCodeFromType(CodeTypeDeclaration, TextWriter, CodeGeneratorOptions)

Создает код для указанного объявления типа объектной модели документов кода (CodeDOM) и направляет его указанному модулю записи текста, используя заданные параметры.

GetAllCompilerInfo()

Возвращает параметры поставщика и компилятора языка для данного компьютера.

GetCompilerInfo(String)

Возвращает параметры поставщика и компилятора языка для заданного языка.

GetConverter(Type)

Получает TypeConverter для указанного типа данных.

GetHashCode()

Служит хэш-функцией по умолчанию.

(Унаследовано от Object)
GetLanguageFromExtension(String)

Возвращает имя языка, связанное с определенным расширением имени файла, как настроено в разделе конфигурации компилятора CodeDomProvider.

GetLifetimeService()
Устаревшие..

Извлекает объект обслуживания во время существования, который управляет политикой времени существования данного экземпляра.

(Унаследовано от MarshalByRefObject)
GetService(Type)

Возвращает объект, представляющий службу, предоставляемую классом Component или классом Container.

(Унаследовано от Component)
GetType()

Возвращает объект Type для текущего экземпляра.

(Унаследовано от Object)
GetTypeOutput(CodeTypeReference)

Получает тип, на который указывает заданный объект CodeTypeReference.

InitializeLifetimeService()
Устаревшие..

Получает объект службы времени существования для управления политикой времени существования для этого экземпляра.

(Унаследовано от MarshalByRefObject)
IsDefinedExtension(String)

Проверяет, имеется ли связанная ли с данным расширением имени файла реализация CodeDomProvider, настроенная на данном компьютере.

IsDefinedLanguage(String)

Проверяет, имеется ли связанная ли с данным языком реализация CodeDomProvider, настроенная на данном компьютере.

IsValidIdentifier(String)

Возвращает значение, показывающее, является ли указанное значение допустимым идентификатором для текущего языка.

MemberwiseClone()

Создает неполную копию текущего объекта Object.

(Унаследовано от Object)
MemberwiseClone(Boolean)

Создает неполную копию текущего объекта MarshalByRefObject.

(Унаследовано от MarshalByRefObject)
Parse(TextReader)

Компилирует код, прочитанный из заданного текстового потока, в объект CodeCompileUnit.

Supports(GeneratorSupport)

Возвращает значение, показывающее, обеспечивается ли указанная поддержка создания кода.

ToString()

Возвращает объект String, содержащий имя Component, если оно есть. Этот метод не следует переопределять.

(Унаследовано от Component)

События

Disposed

Возникает при удалении компонента путем вызова метода Dispose().

(Унаследовано от Component)

Применяется к

Продукт Версии
.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

См. также раздел