begin process at 2012 02 08 05:34:49
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Divers

 > COMPILATION ET RÉFLECTION

COMPILATION ET RÉFLECTION


 Information sur la source

Note :
8 / 10 - par 2 personnes
8,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Divers Source .NET ( DotNet ) Classé sous :Compilation, CodeDom, Compiler, Reflection Niveau :Initié Date de création :29/01/2009 Vu :3 603

Auteur : thiosyiasar

Ecrire un message privé
Ce membre participe au partage de revenus publicitaires
Commentaire sur cette source (7)
Ajouter un commentaire et/ou une note


 Description

Un petit d exemple d utilisation du compilateur C# de .net.
J'en avais besoin pour une appli alors si ca peu vous faire gagner de temps...
Le code source est dans une chaine, il est compilé en mémoire.
Si la compilation réussi, on exécute le point d entrée avec paramètres, puis  une méthode  de test avec paramètres.
Si la compilation échoue, on affiche les erreurs.
Au passage, ca fait un petit exemple d utilisation de la réflexion en .Net

Source

  • using System;
  • using System.CodeDom.Compiler;
  • using System.Reflection;
  • using System.Text;
  • namespace cscomp
  • {
  • static class Program
  • {
  • [STAThread]
  • static void Main()
  • {
  • // Code source a compiler
  • StringBuilder oSource = new StringBuilder();
  • oSource
  • .AppendLine("using System.Windows.Forms;")
  • .AppendLine("namespace nsTest")
  • .AppendLine("{")
  • .AppendLine(" public static class Program")
  • .AppendLine(" {")
  • .AppendLine(" public static void Main()")
  • .AppendLine(" {")
  • .AppendLine(" MessageBox.Show(\"Hello !!\");")
  • .AppendLine(" }")
  • .AppendLine(" public static void Test(object args)")
  • .AppendLine(" {")
  • .AppendLine(" MessageBox.Show(\"Test :'\" + args.ToString() + \"'\");")
  • .AppendLine(" }")
  • .AppendLine(" }")
  • .AppendLine("}");
  • // Instanciation du compilateur et des ses paramètres
  • CodeDomProvider oCodeProvider = new Microsoft.CSharp.CSharpCodeProvider();
  • CompilerParameters oCompPrms = new CompilerParameters();
  • // Définition des références
  • oCompPrms.ReferencedAssemblies.Add("System.dll");
  • oCompPrms.ReferencedAssemblies.Add("System.Windows.Forms.dll");
  • // Paramètres non utilisé
  • //oCompPrms.EmbeddedResources.Clear();
  • //oCompPrms.LinkedResources.Clear();
  • //oCompPrms.TempFiles.Clear();
  • //oCompPrms.UserToken = new IntPtr(0);
  • //oCompPrms.Win32Resource = "";
  • //oCompPrms.OutputAssembly = "nsTest";
  • //oCompPrms.CompilerOptions = string.Empty;
  • //oCompPrms.Evidence = null;
  • // Définition des paramètres de compilation
  • oCompPrms.GenerateExecutable = true;
  • oCompPrms.GenerateInMemory = true;
  • oCompPrms.IncludeDebugInformation = false;
  • oCompPrms.TreatWarningsAsErrors = true;
  • oCompPrms.MainClass = "nsTest.Program";
  • oCompPrms.WarningLevel = 3;
  • // Compilation du code
  • CompilerResults oCompResults
  • = oCodeProvider.CompileAssemblyFromSource
  • (oCompPrms, new string[] { oSource.ToString() });
  • // Si compilation réussie
  • if (oCompResults.NativeCompilerReturnValue == 0)
  • {
  • // Lecture de l'assembly compilé
  • Assembly oAssembly = oCompResults.CompiledAssembly;
  • // Invocation du point d'entrée (Main)
  • object oRunResult = oAssembly.EntryPoint.Invoke(null, null);
  • // Invocation de la méthode test
  • Type oType = oAssembly.GetType("nsTest.Program");
  • MethodInfo oMethod = oType.GetMethod("Test", new Type[]{ typeof(object) });
  • oMethod.Invoke(null, new object[] { "toto" });
  • }
  • // Si erreur de compilation
  • else
  • {
  • // Affichage des erreurs
  • foreach (CompilerError oCompError in oCompResults.Errors)
  • {
  • string sCompError = string.Format
  • (
  • "{0} (l:{1},c:{2}) '{3}' ({4}):{5}",
  • (oCompError.IsWarning) ? "warning" : "error",
  • oCompError.Line.ToString(), oCompError.Column.ToString(),
  • oCompError.FileName,
  • oCompError.ErrorNumber, oCompError.ErrorText
  • );
  • System.Diagnostics.Debug.WriteLine(sCompError);
  • }
  • }
  • }
  • }
  • }
using System;
using System.CodeDom.Compiler;
using System.Reflection;
using System.Text;

namespace cscomp
{
    static class Program
    {
        [STAThread]
        static void Main()
        {
            // Code source a compiler
            StringBuilder oSource = new StringBuilder();
            oSource
            .AppendLine("using System.Windows.Forms;")
            .AppendLine("namespace nsTest")
            .AppendLine("{")
            .AppendLine(" public static class Program")
            .AppendLine(" {")
            .AppendLine("  public static void Main()")
            .AppendLine("  {")
            .AppendLine("   MessageBox.Show(\"Hello !!\");")
            .AppendLine("  }")
            .AppendLine("  public static void Test(object args)")
            .AppendLine("  {")
            .AppendLine("   MessageBox.Show(\"Test :'\" + args.ToString() + \"'\");")
            .AppendLine("  }")
            .AppendLine(" }")
            .AppendLine("}");
            
            // Instanciation du compilateur et des ses paramètres
            CodeDomProvider oCodeProvider = new Microsoft.CSharp.CSharpCodeProvider();
            CompilerParameters oCompPrms = new CompilerParameters();

            // Définition des références
            oCompPrms.ReferencedAssemblies.Add("System.dll");
            oCompPrms.ReferencedAssemblies.Add("System.Windows.Forms.dll");
            
            // Paramètres non utilisé
            //oCompPrms.EmbeddedResources.Clear();
            //oCompPrms.LinkedResources.Clear();
            //oCompPrms.TempFiles.Clear(); 
            //oCompPrms.UserToken = new IntPtr(0);
            //oCompPrms.Win32Resource = "";
            //oCompPrms.OutputAssembly = "nsTest";
            //oCompPrms.CompilerOptions  = string.Empty;
            //oCompPrms.Evidence = null;
            
            //  Définition des paramètres de compilation
            oCompPrms.GenerateExecutable = true;
            oCompPrms.GenerateInMemory = true;
            oCompPrms.IncludeDebugInformation = false;
            oCompPrms.TreatWarningsAsErrors  = true;
            oCompPrms.MainClass = "nsTest.Program";
            oCompPrms.WarningLevel = 3;

            // Compilation du code
            CompilerResults oCompResults 
                = oCodeProvider.CompileAssemblyFromSource
                (oCompPrms, new string[] { oSource.ToString() });

            //  Si compilation réussie
            if (oCompResults.NativeCompilerReturnValue == 0)
            {
                // Lecture de l'assembly compilé
                Assembly oAssembly = oCompResults.CompiledAssembly;
    
                // Invocation du point d'entrée (Main)
                object oRunResult = oAssembly.EntryPoint.Invoke(null, null);
                
                // Invocation de la méthode test
                Type oType = oAssembly.GetType("nsTest.Program");
                MethodInfo oMethod = oType.GetMethod("Test", new Type[]{ typeof(object) });
                oMethod.Invoke(null, new object[] { "toto" });
            }

            // Si erreur de compilation
            else
            {
                // Affichage des erreurs
                foreach (CompilerError oCompError in oCompResults.Errors)
                {
                    string sCompError = string.Format
                    (
                        "{0} (l:{1},c:{2}) '{3}' ({4}):{5}",
                        (oCompError.IsWarning) ? "warning" : "error",
                        oCompError.Line.ToString(), oCompError.Column.ToString(),
                        oCompError.FileName,
                        oCompError.ErrorNumber, oCompError.ErrorText
                    );
                    System.Diagnostics.Debug.WriteLine(sCompError);
                }
            }

        }

    }

}


 Conclusion

Pour tester, créer un nouveau projet winform, et copier le code dans la classe program.



 Sources du même auteur

Source avec Zip Source avec une capture Source .NET (Dotnet) GESTION BASE DE CONNAISSANCE / CONCEPTION 3 TIERS
Source avec Zip Source .NET (Dotnet) GÉNÉRATEUR DE DOCUMENTATION (LIB POUR RÉFLECTION ET XMLDOC)
Source avec Zip Source avec une capture Source .NET (Dotnet) PARSER HTML
Source avec Zip Source avec une capture Source .NET (Dotnet) GÉNÉRATEUR DE SCRIPT SQL DE DONNÉES
Source avec Zip Source avec une capture Source .NET (Dotnet) EXPLORATEUR D'ASSEMBLY DANS UN TREEVIEW

 Sources de la même categorie

Source avec Zip Source .NET (Dotnet) SAUVEGARDE DES TAILLES ET LOCATIONS DES FENÊTRES. par cryt3k
Source avec Zip Source avec une capture Source .NET (Dotnet) TENNIS STATISTIQUES par thebigboss
Source avec Zip Source .NET (Dotnet) TRANSFERT DE DONNÉES, SÉRIALIZATION XML POUR WINFORM par l0r3nz1
Source avec une capture Source .NET (Dotnet) CONTRÔLE TEXTBOX VALIDATEUR par monsieurx12
Source avec Zip Source avec une capture Source .NET (Dotnet) PANEL IRC AVEC MARGE DEPLACABLE ET BACKGROUND IMAGE par yohan49

 Sources en rapport avec celle ci

Source avec Zip Source .NET (Dotnet) SCRIPTS DE PILOTAGE REFLECTION 8 par Renfield
Source avec Zip PREPAREDFORMAT par Warny
Source avec Zip Source .NET (Dotnet) CLASSE XMLMAPPER par Warny
Source .NET (Dotnet) CALCULE D'UNE EXPRESSION MATHEMATIQUE PAR COMPILATION par yohan49
Source .NET (Dotnet) REFLECTION .NET par Yxion

Commentaires et avis

Commentaire de lakichemole le 30/01/2009 10:37:36 7/10

Exemple sympas :) ça change des source habituelles, petit question par contre pourquoi tu ne fais pas l'inclusion de tes dll à partir du code (et pas en dure)?
Je m'explique, tu fait un "using System.window.form" dans ton code, on pourrais imaginer un parser qui cherche les using et qui inclue en conséquence les dll qui vont bien?
Ou je m'égards peut être!!

Commentaire de thiosyiasar le 30/01/2009 13:21:07

Salut et merci pour ton commentaire.<br/>
<br/>
Je ne suis pas expert sur l'utilisation du compilo mais j'ai l'impression comme c'est comme dans visual studio :.<br/>
Tu dois ajouter une référence à ton projet et utiliser la directive using dans ton code.<br/>

donc.<br/>
// Définition des références.<br/>
oCompPrms.ReferencedAssemblies.Add("System.Windows.Forms.dll");<br/>
using dans le code sinon ca compile pas.<br/>
<br/>
Si tu as un autre moyen, il est le bien venu :)<br/>
<br/>

Commentaire de oximoron le 30/01/2009 13:26:18 9/10

Merci, c'est clair et concis peut être un peu trop ;) je me pose quand même quelques questions : On peut générer un exe avec la compilation à la volé ? Dans quels cas c'est utile (car on peut vite faire des trucs bien crados) ? Un système de plugin (développés par des tiers pour une appli) marche de cette façon ?

Commentaire de thiosyiasar le 30/01/2009 15:05:39

* On peut générer un exe ? oui
oCompPrms.GenerateExecutable = true;
oCompPrms.GenerateInMemory = false;
* Utilité ?
Dans mon cas, une application ou l'utilisateur peut ajouter certaines fonctionnalité avec du code C#.
* System de plugins ?
On utilise des interfaces dans l'application, et la réflexion(objet Activator) pour définir l'implémentation dans une dll qui implémente ces interfaces.


Commentaire de lakichemole le 30/01/2009 15:22:42

Non en fait se que je voulais dire c'est que tu aurais pu parcourir ton code en récupérant tous les using et après pour chaque using récupéré ba tu rajoute ta ligne un truc du genre:
foreach string using in ListUsingTrouve
{
     oCompPrms.ReferencedAssemblies.Add(using);
}
ça rendrais plus générique si bien que pour rajouter un using tu n'a qu'a le faire dans ta partie code (version string)
Je sais pas si je em fait comprendre :/

Commentaire de thiosyiasar le 30/01/2009 15:35:06

Si j'ai compris :), c'est vrai que j'aurais pu détecter les using du code, mais je préfère un exemple le plus simple possible.

Commentaire de lakichemole le 30/01/2009 15:43:00

oki :)

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Compilation personnalisée pour un attribut [ par Julien237 ] Bonjour,Je cherche un moyen de compiler moi-même les membres marqués par un attribut donné.Exemple simpliste :[AllwaysReturn(5)]public int Method(...) Reflection sur une méthode statique [ par t00f ] Bonjour à tous,Je viens vers vous pour une question concernant la réflection.Lorsque j'appelle une méthode normalement (non statique) je peux récupére Reflection sur une liste [ par t00f ] Bonjour à tous,Je reviens vers vous pour une nouvelle question sur la reflexion.J'ai une class qui possède une List d'objet B, avec B qui hérite de la Problème de compilation d'une Application C# sur SmartPhone [ par Mohammad000 ] SalamJ'ai un problème lors de la compilation d'un programme écris en Visual Studio 2008 (C#), Mon programme doit tourner dans un SmartPhone, il doit p Compilation .exe [ par MrGsus ] Bonjour voila je developpe sur le logiciel gratuit SharpDevelop2.2 , j'ai tapé mon programme en mode windows avec plusieur form mais maintenant j directive de compilation pour generer projet en mode release [ par fantasio36 ] Bonjour a tous,J'ai rajoute un menu de debug qui apparait sous la forme d'un menu en plus dans un tabcontrol sur mon projet C#... Est-il possible de m Zedgraph - erreurs à la compilation [ par ndiayebass ] Bonjour, L'ajout du dll de Zedgraph v1.1.4322 dans le framework 1.1 me renvoie des erreurs du genre 'Label est une référence ambigüe'. Quelqu'un(une) Gestion d'événement suite à compilation [ par docofwar ] Bonjour, je m'explique, j'ai un petit souci.J'ai créé une application. Dans celle-ci j'ai plusieur bouton qu'il appelle un compilo spécifique. Je redi C# sans framwork ? [ par reacen ] Salut,Je change de vb6, en language C, je pass par le C# dabord, J'ai le VC# expresse 2008, il y a un moyen de compiler mes exe, et les envoyer a un c Compiler [ par vinvin92 ] Salut, je suis nouveau sur le forum et je débute vraiment en programmation. J'ai Visual C++ 2008 Express et j'essaye donc de compiler le code source


Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,248 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales