Udostępnij za pośrednictwem


Programowe kompilowanie kodu przy użyciu kompilatora języka C#

W tym artykule opisano sposób kompilowania kodu ze źródła tekstu przy użyciu kompilatora języka C#.

Oryginalna wersja produktu: Visual Studio, .NET Framework
Oryginalny numer KB: 304655

Podsumowanie

Program Microsoft .NET Framework udostępnia klasy, które umożliwiają programowy dostęp do kompilatora języka C#. Może to być przydatne, jeśli chcesz napisać własne narzędzia kompilowania kodu. Ten artykuł zawiera przykładowy kod, który umożliwia kompilowanie kodu ze źródła tekstu. Aplikacja umożliwia tylko skompilowanie pliku wykonywalnego lub skompilowanie pliku wykonywalnego i uruchomienie go. Wszelkie błędy występujące podczas procesu kompilacji są wyświetlane w formularzu.

Wymagania

  • Visual Studio
  • Kompilator języka Visual C#

Kompilowanie kodu przy użyciu kompilatora języka C#

Program .NET Framework udostępnia interfejs wykonywania kompilatora ICodeCompiler . Klasa CSharpCodeProvider implementuje ten interfejs i zapewnia dostęp do wystąpień generatora kodu języka C# i kompilatora kodu. Poniższy przykładowy kod tworzy wystąpienie CSharpCodeProvider obiektu i używa go do uzyskania odwołania do interfejsu ICodeCompiler .

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

Gdy masz odwołanie do interfejsu, możesz go użyć do skompilowania kodu źródłowego ICodeCompiler . Parametry zostaną przekazane do kompilatora CompilerParameters przy użyciu klasy . Oto przykład:

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

Powyższy kod używa CompilerParameters obiektu , aby poinformować kompilator, że chcesz wygenerować plik wykonywalny (w przeciwieństwie do biblioteki DLL) i że chcesz wyświetlić wynikowy zestaw na dysku. Wywołanie metody CompileAssemblyFromSource to miejsce, w którym zestaw zostanie skompilowany. Ta metoda przyjmuje obiekt parameters i kod źródłowy, który jest ciągiem. Po skompilowaniu kodu możesz sprawdzić, czy wystąpiły jakieś błędy kompilacji. Należy użyć wartości zwracanej z CompileAssemblyFromSource, która jest obiektem CompilerResults . Ten obiekt zawiera kolekcję błędów, która zawiera błędy, które wystąpiły podczas kompilacji.

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;
    }
}

Istnieją inne opcje kompilowania, takie jak kompilowanie z pliku. Można również skompilować wsadowe, co oznacza, że można jednocześnie skompilować wiele plików lub źródeł.

Przykład procedury krok po kroku

  1. Utwórz nową aplikację platformy .NET dla systemu Windows w języku Visual C#. Formularz1 jest tworzony domyślnie.

  2. Dodaj kontrolkę Przycisk do formularza Form1, a następnie zmień jej właściwość Text na Build.

  3. Dodaj kolejną kontrolkę Przycisk do formularza Form1, a następnie zmień jej właściwość Text na Uruchom.

  4. Dodaj dwie kontrolki TextBox do formularza Form1, ustaw właściwość Multiline dla obu kontrolek na true, a następnie ustaw rozmiar tych kontrolek, aby można było wkleić wiele wierszy tekstu do każdego z nich.

  5. W edytorze kodu otwórz plik źródłowy Form1.cs .

  6. Form1 W klasie wklej następujący przycisk, aby kliknąć procedurę obsługi.

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

    Na początku pliku dodaj następujące using instrukcje:

    using System.CodeDom.Compiler;
    using System.Diagnostics;
    using Microsoft.CSharp;
    
  7. W Form1.cs znajdź Form1 konstruktor.

  8. Po wywołaniu metody InitializeComponent w konstruktorze Form1 dodaj następujący kod, aby połączyć procedurę obsługi kliknięć przycisku do obu przycisków dodanych do formularza Form1.

    public Form1()
    {
        InitializeComponent();
        this.button1.Click += new System.EventHandler(this.button1_Click);
        this.button2.Click += new System.EventHandler(this.button1_Click);
    }
    
  9. Uruchamianie projektu. Po załadowaniu formularza Form1 kliknij przycisk Kompilacja.

    Uwaga 16.

    Występuje błąd kompilatora.

  10. Następnie skopiuj następujący tekst do pola tekstowego, zastępując dowolny istniejący tekst:

    using System;
    namespace HelloWorld
    {
        /// <summary>
        /// Summary description for Class1.
        /// </summary>
        class HelloWorldClass
        {
            static void Main(string[] args)
            {
                Console.WriteLine("Hello World!");
                Console.ReadLine();
            }
        }
    }
    
  11. Kliknij ponownie pozycję Kompiluj . Kompilacja powinna zakończyć się pomyślnie.

  12. Kliknij przycisk Uruchom i skompiluje kod i uruchom wynikowy plik wykonywalny. Kompilator tworzy plik wykonywalny o nazwie Out.exe, który jest zapisywany w tym samym folderze co uruchomiona aplikacja.

    Uwaga 16.

    Możesz zmodyfikować kod w polu tekstowym, aby zobaczyć różne błędy kompilatora. Na przykład usuń jeden z średników i ponownie skompiluj kod.

  13. Na koniec zmodyfikuj kod w polu tekstowym, aby wyświetlić kolejny wiersz tekstu w oknie konsoli. Kliknij przycisk Uruchom , aby wyświetlić dane wyjściowe.

Informacje