Code programmatisch compileren met behulp van C#-compiler

In dit artikel wordt beschreven hoe u code uit een tekstbron compileert met behulp van de C#-compiler.

Oorspronkelijke productversie: Visual Studio, .NET Framework
Origineel KB-nummer: 304655

Samenvatting

Microsoft .NET Framework biedt klassen waarmee u programmatisch toegang hebt tot de C#-taalcomppilatie. Dit kan handig zijn als u uw eigen hulpprogramma's voor het compileren van code wilt schrijven. Dit artikel bevat voorbeeldcode waarmee u code uit een tekstbron kunt compileren. Met de toepassing kunt u het uitvoerbare bestand bouwen of het uitvoerbare bestand bouwen en uitvoeren. Eventuele fouten die optreden tijdens het compilatieproces, worden weergegeven op het formulier.

Vereisten

  • Visual Studio
  • Visual C#-taalcomppilatie

Code compileren met behulp van C#-compiler

De .NET Framework biedt de interface voor het uitvoeren van de ICodeCompiler compiler. De CSharpCodeProvider klasse implementeert deze interface en biedt toegang tot exemplaren van de C#-codegenerator en code-compiler. De volgende voorbeeldcode maakt een exemplaar van CSharpCodeProvider en gebruikt deze om een verwijzing naar een ICodeCompiler interface op te halen.

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

Zodra u een verwijzing naar een ICodeCompiler interface hebt, kunt u deze gebruiken om uw broncode te compileren. U geeft parameters door aan de compiler met behulp van de CompilerParameters klasse. Hier volgt een voorbeeld:

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

De bovenstaande code gebruikt het CompilerParameters -object om de compiler te vertellen dat u een uitvoerbaar bestand wilt genereren (in plaats van een DLL) en dat u de resulterende assembly naar de schijf wilt uitvoeren. De aanroep naar CompileAssemblyFromSource is waar de assembly wordt gecompileerd. Deze methode gebruikt het parameters-object en de broncode, een tekenreeks. Nadat u de code hebt gecompileerd, kunt u controleren of er compilatiefouten zijn opgetreden. U gebruikt de retourwaarde van CompileAssemblyFromSource, wat een CompilerResults object is. Dit object bevat een foutenverzameling, die eventuele fouten bevat die zijn opgetreden tijdens het compileren.

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

Er zijn andere opties voor het compileren, zoals het compileren vanuit een bestand. U kunt ook batchgewijs compileren, wat betekent dat u meerdere bestanden of bronnen tegelijk kunt compileren.

Voorbeeld van stapsgewijze procedure

  1. Maak een nieuwe Visual C# .NET Windows-toepassing. Form1 wordt standaard gemaakt.

  2. Voeg een besturingselement Knop toe aan Form1 en wijzig vervolgens de eigenschap Text in Build.

  3. Voeg nog een besturingselement Knop toe aan Form1 en wijzig vervolgens de eigenschap Text in Uitvoeren.

  4. Voeg twee tekstvakbesturingselementen toe aan Form1, stel de eigenschap Multiline voor beide besturingselementen in op Waar en pas vervolgens de grootte van deze besturingselementen aan, zodat u meerdere regels tekst in elke besturingselementen kunt plakken.

  5. Open in de code-editor het Form1.cs bronbestand.

  6. Plak in de Form1 klasse de volgende knop klikhandler.

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

    Voeg aan het begin van het bestand de volgende using instructies toe:

    using System.CodeDom.Compiler;
    using System.Diagnostics;
    using Microsoft.CSharp;
    
  7. Zoek in Form1.cs de Form1 constructor.

  8. Voeg na de aanroep naar InitializeComponent in de Form1 constructor de volgende code toe om de knopklikhandler te verbinden met beide knoppen die u hebt toegevoegd aan Form1.

    public Form1()
    {
        InitializeComponent();
        this.button1.Click += new System.EventHandler(this.button1_Click);
        this.button2.Click += new System.EventHandler(this.button1_Click);
    }
    
  9. Voer het project uit. Nadat Form1 is geladen, klikt u op de knop Bouwen .

    Opmerking

    U krijgt een compilerfout.

  10. Kopieer vervolgens de volgende tekst naar het tekstvak en vervang eventuele bestaande 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. Klik nogmaals op Bouwen . De compileer moet zijn voltooid.

  12. Klik op Uitvoeren om de code te compileren en het resulterende uitvoerbare bestand uit te voeren. De compile maakt een uitvoerbaar bestand met de naam Out.exe, dat wordt opgeslagen in dezelfde map als de toepassing die u uitvoert.

    Opmerking

    U kunt de code in het tekstvak wijzigen om verschillende compilerfouten te zien. Verwijder bijvoorbeeld een van de puntkomma's en bouw de code opnieuw.

  13. Wijzig ten slotte de code in het tekstvak om een andere regel tekst uit te voeren naar het consolevenster. Klik op Uitvoeren om de uitvoer weer te geven.

Verwijzingen