Numéro d'article: 304655 - Dernière mise à jour: mercredi 30 juillet 2008 - Version: 3.1

Comment par programme les code de compilation à l'aide du compilateur c#

A noterCet article s'applique à un système d'exploitation différent de celui que vous utilisez. Le contenu de l'article qui ne vous concerne peut-être pas est désactivé.
Pour un Visual Basic .NET de cet article, reportez-vous 304654  (http://support.microsoft.com/kb/304654/ ) .

Sommaire

Agrandir tout | Réduire tout

Résumé

Le .NET Framework expose des classes qui permettent d'accéder par programme le compilateur de langage c#. Cela peut être utile si vous souhaitez écrire vos propres utilitaires 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 permet de pouvoir soit simplement générer le fichier exécutable ou générer l'exécutable et l'exécuter. Les erreurs qui se produisent pendant le processus de compilation sont affichés sur le formulaire.

Plus d'informations

L'étape 1: configuration requise

  • Visual Studio
  • Compilateur de langage Visual c#

Étape 2: Comment compiler du code par programme

Le .NET Framework fournit l'interface de l'exécution du compilateur ICodeCompiler. La classe CSharpCodeProvider 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 une instance de CSharpCodeProvider et l'utilise pour obtenir une référence à une interface ICodeCompiler.
CSharpCodeProvider codeProvider = new CSharpCodeProvider();
ICodeCompiler icc = codeProvider.CreateCompiler();
				

Une fois que vous avez une référence à une interface ICodeCompiler, vous pouvez l'utiliser pour compiler votre code source. Vous passerez paramètres au compilateur en utilisant la classe CompilerParameters . 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 copier l'assembly résultant sur le disque. L'appel à CompileAssemblyFromSource est où l'assembly obtient compilé. Cette méthode prend l'objet des paramètres et le code source, qui est une chaîne. Après avoir compilé votre code, vous pouvez vérifier si des erreurs de compilation. Vous utilisez la valeur de retour de CompileAssemblyFromSource , qui est un objet CompilerResults. Cet objet contient une collection d'erreurs, qui contient les éventuelles erreurs survenues 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 autres options de compilation, telles que la compilation à partir d'un fichier. Vous pouvez également lot compiler, ce qui signifie que vous pouvez compiler plusieurs fichiers ou des sources en même temps. Vous trouverez plus d'informations sur ces classes dans MSDN Online Library :
http://msdn.microsoft.com/en-us/default.aspx (http://msdn.microsoft.com/en-us/default.aspx)

À l'étape 3 : Exemple de procédure pas à pas

  1. Créez une nouvelle application Windows Visual c# .NET. Form1 est créé par défaut.
  2. Ajoutez un contrôle de bouton à Form1 et modifiez sa propriété Text à créer .
  3. Ajoutez un autre contrôle de bouton à Form1 et modifiez sa propriété Text pour Exécuter .
  4. Ajoutez deux contrôles TextBox à Form1, définissez la propriété MultiLine pour les deux contrôles sur True et puis redimensionner ces contrôles afin que vous pouvez coller plusieurs lignes de texte dans chacun d'eux.
  5. Dans l'éditeur de code, ouvrez le fichier source Form1.cs.
  6. Dans la classe Form1 , coller le bouton suivant, cliquez sur Gestionnaire.
    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);
        }
    }
    Add the beginning of the file, add these using statements:
    using System.CodeDom.Compiler;
    using System.Diagnostics;
    using Microsoft.CSharp;
    
    Remarque si vous utilisez Visual Studio 2005 ou Visual Studio 2008, la classe CSharpCodeProvider a été désapprouvée. Vous pouvez utiliser la classe CodeDomProvider au lieu de cela, comme le montre l'implémentation de Button1_Click suivante.
    private void button1_Click(object sender, System.EventArgs e)
    {
        CodeDomProvider codeProvider = CodeDomProvider.CreateProvider("CSharp");
        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 = codeProvider.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);
        }
    }
    Add the beginning of the file, add these using statements:
    using System.CodeDom.Compiler;
    using System.Diagnostics;
    
  7. Dans Form1.cs, recherchez le constructeur de Form1.
  8. Après l'appel à InitializeComponent dans le constructeur Form1, ajoutez le code suivant pour associer le bouton cliquez sur Gestionnaire pour les 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. Une fois chargé de Form1, cliquez sur le bouton Générer . Notez que vous obtenez une erreur du compilateur.
  10. Ensuite, copiez le texte suivant dans la zone de texte, remplacer n'importe quel 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 , et compiler le code et exécutez le fichier exécutable obtenu. La compilation crée un fichier exécutable nommé «Out.exe», qui est enregistrée 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 les erreurs du compilateur différents. Par exemple, supprimez un des points-virgules et reconstruire le code.
  13. Enfin, modifiez le code dans la zone de texte pour une autre ligne de texte dans la fenêtre de console. Cliquez sur Exécuter pour voir le résultat.

Références

Classe CSharpCodeProvider
http://msdn.microsoft.com/en-us/library/microsoft.csharp.csharpcodeprovider.aspx (http://msdn.microsoft.com/en-us/library/microsoft.csharp.csharpcodeprovider.aspx)

Interface ICodeCompiler
http://msdn.microsoft.com/en-us/library/system.codedom.compiler.icodecompiler.aspx (http://msdn.microsoft.com/en-us/library/system.codedom.compiler.icodecompiler.aspx)

Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft Visual C# 2008 Express Edition
  • Microsoft .NET Framework 1.0 sur le système suivant
    • Microsoft Visual C# .NET 2002 Initiation
Mots-clés : 
kbmt kbsweptvs2008 kbbcl kbcompiler kbhowto kbprod2web KB304655 KbMtfr
Traduction automatiqueTraduction automatique
IMPORTANT : Cet article est issu du système de traduction automatique mis au point par Microsoft (http://support.microsoft.com/gp/mtdetails). Un certain nombre d?articles obtenus par traduction automatique sont en effet mis à votre disposition en complément des articles traduits en langue française par des traducteurs professionnels. Cela vous permet d?avoir accès, dans votre propre langue, à l?ensemble des articles de la base de connaissances rédigés originellement en langue anglaise. Les articles traduits automatiquement ne sont pas toujours parfaits et peuvent comporter des erreurs de vocabulaire, de syntaxe ou de grammaire (probablement semblables aux erreurs que ferait une personne étrangère s?exprimant dans votre langue !). Néanmoins, mis à part ces imperfections, ces articles devraient suffire à vous orienter et à vous aider à résoudre votre problème. Microsoft s?efforce aussi continuellement de faire évoluer son système de traduction automatique.
La version anglaise de cet article est la suivante: 304655  (http://support.microsoft.com/kb/304655/en-us/ )
L'INFORMATION CONTENUE DANS CE DOCUMENT EST FOURNIE PAR MICROSOFT SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. L'UTILISATEUR ASSUME LE RISQUE DE L'UTILISATION DU CONTENU DE CE DOCUMENT. CE DOCUMENT NE PEUT ETRE REVENDU OU CEDE EN ECHANGE D'UN QUELCONQUE PROFIT.