Delen via


Code programmatisch compileren met behulp van C#-compiler

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

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

Samenvatting

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

Behoeften

  • Visual Studio
  • Visual C#-taalcompilatie

Code compileren met behulp van C#-compiler

Het .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 codecompilator. 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. Dit is een voorbeeld:

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

In de bovenstaande code wordt het CompilerParameters object gebruikt om de compiler te laten weten 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 de locatie waar de assembly wordt gecompileerd. Deze methode gebruikt het parameterobject 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, een CompilerResults object. Dit object bevat een verzameling fouten, die 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 compileren vanuit een bestand. U kunt ook batchcompilatie uitvoeren, 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 teksteigenschap in Opbouwen.

  3. Voeg nog een knopbesturingselement toe aan Form1 en wijzig vervolgens de teksteigenschap in Uitvoeren.

  4. Voeg twee besturingselementen voor tekstvak toe aan Form1, stel de eigenschap Meerdere regels voor beide besturingselementen in op Waar en pas deze besturingselementen vervolgens aan zodat u meerdere regels tekst in elk besturingselement kunt plakken.

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

  6. Plak de volgende knop in de Form1 klasse op handler.

    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 in InitializeComponent de Form1 constructor de volgende code toe om de knopknophandler te koppelen aan beide knoppen die u aan Form1 hebt toegevoegd.

    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 Opbouwen .

    Notitie

    U krijgt een compilerfout.

  10. Kopieer vervolgens de volgende tekst naar het tekstvak, waarbij u bestaande tekst vervangt:

    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 Opbouwen . Het compileren moet zijn geslaagd.

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

    Notitie

    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 tekstregel naar het consolevenster uit te voeren. Klik op Uitvoeren om de uitvoer weer te geven.

Verwijzingen