Compiler du code par programmation à l’aide du compilateur C#

Cet article explique comment compiler du code à partir d’une source de texte à l’aide du compilateur C#.

Version d’origine du produit : Visual Studio, .NET Framework
Numéro de la base de connaissances d’origine : 304655

Résumé

Microsoft .NET Framework expose des classes qui vous permettent d’accéder par programmation au compilateur de langage C#. Cela peut être utile si vous souhaitez écrire vos propres utilitaires de compilation de code. Cet article fournit un exemple de code qui vous permet de compiler du code à partir d’une source de texte. L’application vous permet de générer simplement l’exécutable ou de générer l’exécutable et de l’exécuter. Toutes les erreurs qui se produisent pendant le processus de compilation sont affichées sur le formulaire.

Configuration requise

  • Visual Studio
  • Compilateur de langage Visual C#

Compiler du code à l’aide du compilateur C#

Le .NET Framework fournit l’interface d’exécution du ICodeCompiler compilateur. La CSharpCodeProvider classe implémente cette interface et fournit l’accès aux instances du générateur de code C# et du compilateur de code. L’exemple de code suivant crée un instance de et l’utilise CSharpCodeProvider pour obtenir une référence à une ICodeCompiler interface.

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

Une fois que vous avez une référence à une ICodeCompiler interface, vous pouvez l’utiliser pour compiler votre code source. Vous passerez des paramètres au compilateur à l’aide de la CompilerParameters classe . Voici un exemple :

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

Le code ci-dessus utilise l’objet CompilerParameters pour indiquer au compilateur que vous souhaitez générer un fichier exécutable (par opposition à une DLL) et que vous souhaitez générer l’assembly obtenu sur le disque. L’appel à CompileAssemblyFromSource est l’endroit où l’assembly est compilé. Cette méthode prend l’objet parameters et le code source, qui est une chaîne. Après avoir compilé votre code, vous pouvez case activée pour voir s’il y a eu des erreurs de compilation. Vous utilisez la valeur de retour de CompileAssemblyFromSource, qui est un CompilerResults objet . Cet objet contient une collection errors, qui contient toutes les erreurs qui se sont produites pendant la compilation.

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

Il existe d’autres options de compilation, telles que la compilation à partir d’un fichier. Vous pouvez également compiler par lots, ce qui signifie que vous pouvez compiler plusieurs fichiers ou sources en même temps.

Exemple de procédure pas à pas

  1. Créez une application Windows Visual C# .NET. Form1 est créé par défaut.

  2. Ajoutez un contrôle Button à Form1, puis remplacez sa propriété Text par Build.

  3. Ajoutez un autre contrôle Button à Form1, puis remplacez sa propriété Text par Exécuter.

  4. Ajoutez deux contrôles TextBox à Form1, définissez la propriété Multiline pour les deux contrôles sur True, puis dimensionner ces contrôles afin de pouvoir coller plusieurs lignes de texte dans chacun d’eux.

  5. Dans l’éditeur de code, ouvrez le fichier source Form1.cs .

  6. Dans la Form1 classe , collez le gestionnaire de clic de bouton suivant.

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

    Au début du fichier, ajoutez les instructions suivantes using :

    using System.CodeDom.Compiler;
    using System.Diagnostics;
    using Microsoft.CSharp;
    
  7. Dans Form1.cs, recherchez le Form1 constructeur.

  8. Après l’appel à InitializeComponent dans le Form1 constructeur, ajoutez le code suivant pour relier le gestionnaire de clic de bouton aux deux boutons que vous avez ajoutés à Form1.

    public Form1()
    {
        InitializeComponent();
        this.button1.Click += new System.EventHandler(this.button1_Click);
        this.button2.Click += new System.EventHandler(this.button1_Click);
    }
    
  9. Exécutez le projet. Après le chargement de Form1 , cliquez sur le bouton Générer .

    Remarque

    Vous obtenez une erreur du compilateur.

  10. Ensuite, copiez le texte suivant dans la zone de texte, en remplaçant tout texte existant :

    using System;
    namespace HelloWorld
    {
        /// <summary>
        /// Summary description for Class1.
        /// </summary>
        class HelloWorldClass
        {
            static void Main(string[] args)
            {
                Console.WriteLine("Hello World!");
                Console.ReadLine();
            }
        }
    }
    
  11. Cliquez à nouveau sur Générer . La compilation doit réussir.

  12. Cliquez sur Exécuter pour compiler le code et exécuter le fichier exécutable résultant. La compilation crée un fichier exécutable appelé Out.exe, qui est enregistré dans le même dossier que l’application que vous exécutez.

    Remarque

    Vous pouvez modifier le code dans la zone de texte pour afficher différentes erreurs du compilateur. Par exemple, supprimez l’un des points-virgules et reconstruisez le code.

  13. Enfin, modifiez le code dans la zone de texte pour générer une autre ligne de texte dans la fenêtre de console. Cliquez sur Exécuter pour afficher la sortie.

References