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

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

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

Сводка

Microsoft платформа .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# для Windows. Форма Form1 создается по умолчанию.

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

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

  4. Добавьте два элемента управления TextBox в Form1, задайте для свойства Multiline для обоих элементов управления значение 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. Запустите проект. После загрузки Form1 нажмите кнопку Сборка .

    Примечание.

    Возникает ошибка компилятора.

  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. Наконец, измените код в текстовом поле, чтобы вывести другую строку текста в окно консоли. Нажмите кнопку Выполнить , чтобы просмотреть выходные данные.

Ссылки