IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Contribuez .NET Discussion :

[C#] Comment exécuter une instruction dynamiquement ? [FAQ]


Sujet :

Contribuez .NET

  1. #1
    Membre régulier Avatar de NeoMan
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 171
    Points : 76
    Points
    76
    Par défaut [C#] Comment exécuter une instruction dynamiquement ?
    Bonjour à tous !!

    J'aimerais savoir s'il y a un moyen en C# d'exécuter dynamiquement un code stocké sous forme de chaîne de caractère (jusque là je sais que c'est possible, mais j'ai plus les fonctions en tête) ET d'en récupérer les valeurs (ex: appel à une fonction).

    Exemples de valeur à interpréter : "19", "Coucou", "DateTime.Now", "DateTime.Now + 400", "String.IsNullOrEmpty('') && (Session[0] != null)".

    Je pense qu'il y a un moyen en passant par la compilation dynamique, mais ne connaissant à l'avance le code à évaluer je ne m'en sens pas trop capable. Surtout que si c'est faisable il doit y avoir des méthodes efficaces déjà existantes, non ?

    merci d'avance!

    @++

    NeoMan

  2. #2
    Membre émérite
    Avatar de lakitrid
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    1 535
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 1 535
    Points : 2 388
    Points
    2 388
    Par défaut
    De ce que j'ai vu du framework tu peux compiler du code à la volées ou même executer des instructions en IL, mais là tu veux carrément faire du scripting ?
    Pouquoir ne pas utiliser un interpreteur dedié (type LUA ?) ?

    http://www.gamedev.net/reference/programming/features/lua/

  3. #3
    Membre actif Avatar de DeusXL
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    300
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 300
    Points : 272
    Points
    272
    Par défaut
    CodeDomProvider

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    using System;
    using System.Text;
    using System.Reflection;
    using System.IO;
    using System.CodeDom.Compiler;
    using Microsoft.CSharp;
     
    namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                CodeDomProvider cc = new CSharpCodeProvider();
                CompilerParameters cp = new CompilerParameters();
                cp.ReferencedAssemblies.Add("System.dll");
                StreamReader sr = File.OpenText("function.cs");
                string toCompile = sr.ReadToEnd();
                CompilerResults cr = cc.CompileAssemblyFromSource(cp, toCompile);
                if (cr.Errors.HasErrors)
                {
                    String text = "Il y a eu des erreurs dans la compilation d'un script :\n";
                    foreach (CompilerError err in cr.Errors)
                        text += err + "\n";
                    Console.WriteLine(text);
                    return;
                }	
     
                Assembly a = cr.CompiledAssembly;
                MethodInfo methodinf = a.GetType("MaClasse").GetMethod("SQR");
                object[] temp = new object[1];
                temp[0] = 10;
                int resultat = Convert.ToInt32(methodinf.Invoke(null, temp));
                Console.WriteLine(resultat.ToString());
            }
        }
    }
    Et dans function.cs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    using System;
     
    class MaClasse
    {
        public static int SQR(int x)
        {
            return x * x;
        }
    }
    J'ai bon ?

    Personellement, je me servai de ça car j'avais la flème de faire un analyseur de calculs pour un logiciel qui affichait la courbe d'une fonction...

  4. #4
    Membre régulier Avatar de NeoMan
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 171
    Points : 76
    Points
    76
    Par défaut
    LUA est intéressant mais malheureusement pas adapté à ma problématique. Je dois pouvoir exécuter du code C# stocké dans une base de données (ou généré à la volé). L'idéal serait que le champ de vision de mon code volatil soit celui de mon appel de méthode.
    ex :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    function Object Execute(string code)
    {
    	int a = 100;
    	return LaMethodeMagiqueQueJeCherche(code);
    }
     
    function void TestExecute() 
    {
    	string code = @"
    		function ()
    		{
    			int pas = 1;
    			String.format(\"{0} => {1}\", a, a + pas);
    			return a+pas;
    		}";
    	int resultat = (int)Execute(code);
    }
    Citation Envoyé par DeusXL
    C'est exactement ce que je recherchais !
    Je vais creuser ça !

    Merci !

  5. #5
    Membre régulier Avatar de NeoMan
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 171
    Points : 76
    Points
    76
    Par défaut
    J'ai un problème...
    Il me compile bien le code dynamique, mais il n'arrive pas repêcher la class ClassTmp que je lui fais compiler dynamiquement.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
            public static Object Execute(string code)
            {
                CodeDomProvider cc = new CSharpCodeProvider();
                CompilerParameters cp = new CompilerParameters();
                cp.ReferencedAssemblies.Add("System.dll");
                string toCompile = "using System;\r\n\r\nnamespace MonEspace\r\n{\r\n\tpublic class ClassTmp\r\n\t{\r\n\t\tpublic static Object FunctionTmp()\r\n\t\t{\r\n\t\t\t" + code + "\r\n\t\t}\r\n\t}\r\n}";
                CompilerResults cr = cc.CompileAssemblyFromSource(cp, toCompile);
                if (cr.Errors.HasErrors)
                {
                    return null;
                }
     
                Assembly a = cr.CompiledAssembly;
                Type classTmp = a.GetType("ClassTmp"); \\ Renvoi NULL !
                MethodInfo methodinf = classTmp.GetMethod("FunctionTmp");
     
                return methodinf.Invoke(null, new object[0])
            }
        }
    Ai-je fais une boulette ??

    @+

    NeoMan

  6. #6
    Membre actif Avatar de DeusXL
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    300
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 300
    Points : 272
    Points
    272
    Par défaut
    En virant "namespace MonEspace" non ? Car si tu n'inclues pas le nom de ton programme comme référence, tu peux pas utiliser son namespace...

  7. #7
    Membre régulier Avatar de NeoMan
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 171
    Points : 76
    Points
    76
    Par défaut
    Citation Envoyé par DeusXL
    En virant "namespace MonEspace" non ? Car si tu n'inclues pas le nom de ton programme comme référence, tu peux pas utiliser son namespace...
    J'ai essayé ton idée et maintenant ça tourne super !

    GRAND MERCI A TOUS

  8. #8
    Candidat au Club
    Inscrit en
    Janvier 2004
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Le source final !?
    Citation Envoyé par NeoMan
    J'ai essayé ton idée et maintenant ça tourne super !

    GRAND MERCI A TOUS
    Salut Neoman,

    Pourrais-tu nous dévoiler la version finale de ton code source qui fonctionne car dans le thread précédent, il y avait un bug et tu n'as pas expliqué sa résolution().
    Autre question : As-tu aussi la version VB.NET de ce code ? Ca serait vraiment le top .

    Grand merci,
    mik63

  9. #9
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    Citation Envoyé par mik63
    Autre question : As-tu aussi la version VB.NET de ce code ? Ca serait vraiment le top .
    Ceci devrait t'être utile dans tes prochaines aventures :
    http://convertisseur.developpez.com/Default.aspx

  10. #10
    Candidat au Club
    Inscrit en
    Janvier 2004
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Merci smyley, c'est très utile.

    J'ai une autre question :

    Peut-on faire communiquer le script compilé dynamiquement avec le code des classes compilées normalement dans le sens "code dynamique appelle code statique" (exemple : avec call maFonction) ?
    Et si oui, comment ?
    En effet, j'ai essayé mais la compilation me donne des erreurs.

    Merci

  11. #11
    Expert éminent
    Avatar de neo.51
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    2 663
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 663
    Points : 6 418
    Points
    6 418
    Par défaut
    Citation Envoyé par mik63

    J'ai une autre question :

    Peut-on faire communiquer le script compilé dynamiquement avec le code des classes compilées normalement dans le sens "code dynamique appelle code statique" (exemple : avec call maFonction) ?
    Et si oui, comment ?
    En effet, j'ai essayé mais la compilation me donne des erreurs.
    oui biensur

    Mais là il va nous falloir du code. Je pense qu'il faudrait ouvrir un autre thread car le problème initial est résolu

    a+

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations forums :
    Inscription : Mars 2008
    Messages : 11
    Points : 12
    Points
    12
    Par défaut
    bonjour
    est ce qu'il ya une fonction c# équivalente à "eval" en php??

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comment appeller une fonction dynamiquement, à partir d'un argument
    Par Invité dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 23/04/2006, 16h47
  2. Comment faire une connexion dynamique à une base avec ADO?
    Par Borisam dans le forum Bases de données
    Réponses: 2
    Dernier message: 22/03/2006, 14h22
  3. Comment générer une image dynamiquement ?
    Par K20 dans le forum Langage
    Réponses: 12
    Dernier message: 19/11/2005, 01h27
  4. Comment acceder à un champ d'une maniere dynamique ?
    Par jpg dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 26/11/2004, 15h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo