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


Компиляция кода программным способом с помощью компилятора C#

В этой статье описывается компиляция кода из текстового источника с помощью компилятора C#.

Исходная версия продукта: Visual Studio, платформа .NET Framework
Исходный номер базы знаний: 304655

Итоги

Корпорация Майкрософт платформа .NET Framework предоставляет классы, которые позволяют программным способом получить доступ к компилятору языка C#. Это может быть полезно, если вы хотите написать собственные служебные программы компиляции кода. В этой статье приведен пример кода, который позволяет компилировать код из текстового источника. Приложение позволяет либо создать исполняемый файл, либо создать исполняемый файл и запустить его. Все ошибки, возникающие во время процесса компиляции, отображаются в форме.

Требования

  • Visual Studio
  • Компилятор языка Visual C#

Компиляция кода с помощью компилятора C#

Платформа .NET Framework предоставляет интерфейс выполнения компилятораICodeCompiler. Класс CSharpCodeProvider реализует этот интерфейс и предоставляет доступ к экземплярам генератора кода C# и компилятора кода. Следующий пример кода создает экземпляр CSharpCodeProvider и использует его для получения ссылки на ICodeCompiler интерфейс.

CSharpCodeProvider codeProvider = new CSharpCodeProvider();
ICodeCompiler icc = codeProvider.CreateCompiler();

Получив ссылку на интерфейс, его можно использовать для компиляции исходного ICodeCompiler кода. Параметры передаются компилятору CompilerParameters с помощью класса. Рассмотрим пример:

System.CodeDom.Compiler.CompilerParameters parameters = new CompilerParameters();
parameters.GenerateExecutable = true;
parameters.OutputAssembly = Output;
CompilerResults results = icc.CompileAssemblyFromSource(parameters,SourceString);

Приведенный выше код использует CompilerParameters объект, чтобы сообщить компилятору, что необходимо создать исполняемый файл (в отличие от библиотеки DLL) и вы хотите вывести результирующая сборка на диск. Вызов CompileAssemblyFromSource заключается в том, где сборка компилируется. Этот метод принимает объект параметров и исходный код, который является строкой. После компиляции кода можно проверить наличие ошибок компиляции. Вы используете возвращаемое значение из CompileAssemblyFromSourceобъекта.CompilerResults Этот объект содержит коллекцию ошибок, которая содержит все ошибки, возникшие во время компиляции.

if (results.Errors.Count > 0)
{
    foreach(CompilerError CompErr in results.Errors)
    {
        textBox2.Text = textBox2.Text +
            "Line number " + CompErr.Line +
            ", Error Number: " + CompErr.ErrorNumber +
            ", '" + CompErr.ErrorText + ";" +
            Environment.NewLine + Environment.NewLine;
    }
}

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

Пошаговый пример процедуры

  1. Создайте новое приложение .NET для .NET Для Visual C#. Форма1 создается по умолчанию.

  2. Добавьте элемент управления Button в Form1 и измените его свойство Text на Build.

  3. Добавьте другой элемент управления Button в Form1 и измените его свойство Text на Run.

  4. Добавьте два элемента управления TextBox в Form1, задайте для обоих элементов управления значение "Многострочный" значение True, а затем задайте размер этих элементов управления, чтобы можно было вставить несколько строк текста в каждую из них.

  5. В редакторе кода откройте исходный файл Form1.cs .

  6. Form1 В классе вставьте следующий обработчик нажатия кнопки.

    private void button1_Click(object sender, System.EventArgs e)
    {
        CSharpCodeProvider codeProvider = new CSharpCodeProvider();
        ICodeCompiler icc = codeProvider.CreateCompiler();
        string Output = "Out.exe";
        Button ButtonObject = (Button)sender;
    
        textBox2.Text = "";
        System.CodeDom.Compiler.CompilerParameters parameters = new CompilerParameters();
        //Make sure we generate an EXE, not a DLL
        parameters.GenerateExecutable = true;
        parameters.OutputAssembly = Output;
        CompilerResults results = icc.CompileAssemblyFromSource(parameters, textBox1.Text);
    
        if (results.Errors.Count > 0)
        {
            textBox2.ForeColor = Color.Red;
            foreach (CompilerError CompErr in results.Errors)
            {
                textBox2.Text = textBox2.Text +
                            "Line number " + CompErr.Line +
                            ", Error Number: " + CompErr.ErrorNumber +
                            ", '" + CompErr.ErrorText + ";" +
                            Environment.NewLine + Environment.NewLine;
            }
        }
        else
        {
            //Successful Compile
            textBox2.ForeColor = Color.Blue;
            textBox2.Text = "Success!";
            //If we clicked run then launch our EXE
            if (ButtonObject.Text == "Run") Process.Start(Output);
        }
    }
    

    В начале файла добавьте следующие using инструкции:

    using System.CodeDom.Compiler;
    using System.Diagnostics;
    using Microsoft.CSharp;
    
  7. В Form1.cs найдите Form1 конструктор.

  8. После вызова InitializeComponent конструктора Form1 добавьте следующий код, чтобы провести обработчик нажатия кнопки на обе кнопки, добавленные в Form1.

    public Form1()
    {
        InitializeComponent();
        this.button1.Click += new System.EventHandler(this.button1_Click);
        this.button2.Click += new System.EventHandler(this.button1_Click);
    }
    
  9. Запустите проект. После загрузки формы 1 нажмите кнопку "Сборка".

    Примечание.

    Вы получаете ошибку компилятора.

  10. Затем скопируйте следующий текст в текстовое поле, заменив существующий текст:

    using System;
    namespace HelloWorld
    {
        /// <summary>
        /// Summary description for Class1.
        /// </summary>
        class HelloWorldClass
        {
            static void Main(string[] args)
            {
                Console.WriteLine("Hello World!");
                Console.ReadLine();
            }
        }
    }
    
  11. Нажмите кнопку " Создать еще раз". Компиляция должна быть успешной.

  12. Нажмите кнопку "Выполнить", и он скомпилирует код и запустит полученный исполняемый файл. Компиляция создает исполняемый файл с именем Out.exe, который сохраняется в той же папке, что и запущенное приложение.

    Примечание.

    Вы можете изменить код в текстовом поле, чтобы увидеть различные ошибки компилятора. Например, удалите один из двоеточий и перестроите код.

  13. Наконец, измените код в текстовом поле, чтобы вывести другую строку текста в окно консоли. Нажмите кнопку "Выполнить" , чтобы просмотреть выходные данные.

Ссылки