begin process at 2010 03 22 01:21:20
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Trucs & Astuces

 > EVALUER/EXECUTER UNE CHAINE EN TANT QUE CODE

EVALUER/EXECUTER UNE CHAINE EN TANT QUE CODE


 Information sur la source

Note :
8 / 10 - par 1 personne
8,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Trucs & Astuces Source .NET ( DotNet ) Classé sous :CodeDom, Evaluer, Chaine, Reflection Niveau :Initié Date de création :28/12/2007 Date de mise à jour :28/12/2007 08:39:07 Vu / téléchargé :5 441 / 276

Auteur : divadav

Ecrire un message privé
Site perso
Commentaire sur cette source (6)
Ajouter un commentaire et/ou une note

 Description

Cliquez pour voir la capture en taille normale
Cette source vous permettra d'exécuter une chaîne contenant du code source en VB.Net.
J'utilise CodeDom et la Reflection pour générer un assembly en mémoire, à la demande, et récupérer le résultat du code exécuté.

Comme exemple, j'ai monté une mini mini application de dessin, permettant de générer un menu Transformation avec des fichiers textes contenant le nom de la commande puis le code.

Source

  • ''' <summary>
  • ''' Cette fonction permet l'exécution d'une commande passée sous forme de chaîne.
  • ''' </summary>
  • ''' <param name="cmd">La commande à exécuter sur l'image.</param>
  • ''' <param name="img">L'image d'origne.</param>
  • ''' <returns>L'image transformée selon le code de "cmd".</returns>
  • ''' <remarks></remarks>
  • Private Function ExecuteCommand(ByVal cmd As String, ByVal img As Image) As Image
  • Dim vbCodeProv As VBCodeProvider = New VBCodeProvider
  • Dim cParam As CodeDom.Compiler.CompilerParameters = New CodeDom.Compiler.CompilerParameters
  • ' Ajout des références
  • cParam.ReferencedAssemblies.Add("System.dll")
  • cParam.ReferencedAssemblies.Add("System.Drawing.dll")
  • ' Options du compilateur
  • cParam.CompilerOptions = "/t:library" 'L'assembly est une bibliothèque de classe,
  • cParam.GenerateInMemory = True 'générée uniquement en mémoire.
  • ' Génération du code source
  • Dim sCode As System.Text.StringBuilder = New System.Text.StringBuilder("")
  • sCode.AppendLine("Imports System")
  • sCode.AppendLine("Imports System.Drawing")
  • sCode.AppendLine("Imports System.Diagnostics")
  • sCode.AppendLine()
  • sCode.AppendLine("Namespace Divad")
  • sCode.AppendLine(vbTab & "Class EvalVbCode")
  • sCode.AppendLine(vbTab & vbTab & "Public Function EvalTransformation(ByVal img As Image) as Image")
  • sCode.AppendLine(vbTab & vbTab & vbTab & "Try")
  • sCode.AppendLine()
  • sCode.AppendLine(cmd)
  • sCode.AppendLine()
  • sCode.AppendLine(vbTab & vbTab & vbTab & "Catch ex As Exception")
  • ' En cas d'erreur : console de debug ET renvoie Nothing
  • sCode.AppendLine(vbTab & vbTab & vbTab & vbTab & "Debug.WriteLine(ex.Message)")
  • sCode.AppendLine(vbTab & vbTab & vbTab & vbTab & "Return Nothing")
  • sCode.AppendLine(vbTab & vbTab & vbTab & "End Try")
  • sCode.AppendLine(vbTab & vbTab & "End Function")
  • sCode.AppendLine(vbTab & "End Class")
  • sCode.AppendLine("End Namespace")
  • ' Code de la classe dans la console de debug
  • Debug.WriteLine(sCode.ToString())
  • ' Résultat de la compilation
  • Dim cResult As CodeDom.Compiler.CompilerResults = vbCodeProv.CompileAssemblyFromSource(cParam, sCode.ToString())
  • If cResult.Errors.Count > 0 Then
  • Dim Errors As String = "Erreur(s) : "
  • For Each ce As CodeDom.Compiler.CompilerError In cResult.Errors
  • Errors &= vbCrLf & ce.ErrorText
  • Next ce
  • MsgBox(Errors)
  • Return Nothing
  • Else
  • ' Récupération de l'assembly généré
  • Dim myAssembly As System.Reflection.Assembly = cResult.CompiledAssembly
  • ' Instanciation de EvalVbCode
  • Dim oEvalVbCode As Object = myAssembly.CreateInstance("Divad.EvalVbCode")
  • ' Récupération du type de EvalVbCode
  • Dim tEvalVbCode As Type = oEvalVbCode.GetType()
  • ' Récupération de la méthode EvalTransformation
  • Dim methodEvalTrans As Reflection.MethodInfo = tEvalVbCode.GetMethod("EvalTransformation")
  • ' Invocation de la méthode EvalTransformation
  • Dim myImage As Image = methodEvalTrans.Invoke(oEvalVbCode, New Object() {img})
  • Return myImage
  • End If
  • End Function
    ''' <summary>
    ''' Cette fonction permet l'exécution d'une commande passée sous forme de chaîne.
    ''' </summary>
    ''' <param name="cmd">La commande à exécuter sur l'image.</param>
    ''' <param name="img">L'image d'origne.</param>
    ''' <returns>L'image transformée selon le code de "cmd".</returns>
    ''' <remarks></remarks>
    Private Function ExecuteCommand(ByVal cmd As String, ByVal img As Image) As Image
        Dim vbCodeProv As VBCodeProvider = New VBCodeProvider
        Dim cParam As CodeDom.Compiler.CompilerParameters = New CodeDom.Compiler.CompilerParameters

        ' Ajout des références
        cParam.ReferencedAssemblies.Add("System.dll")
        cParam.ReferencedAssemblies.Add("System.Drawing.dll")

        ' Options du compilateur
        cParam.CompilerOptions = "/t:library"  'L'assembly est une bibliothèque de classe,
        cParam.GenerateInMemory = True         'générée uniquement en mémoire.

        ' Génération du code source
        Dim sCode As System.Text.StringBuilder = New System.Text.StringBuilder("")
        sCode.AppendLine("Imports System")
        sCode.AppendLine("Imports System.Drawing")
        sCode.AppendLine("Imports System.Diagnostics")
        sCode.AppendLine()
        sCode.AppendLine("Namespace Divad")
        sCode.AppendLine(vbTab & "Class EvalVbCode")
        sCode.AppendLine(vbTab & vbTab & "Public Function EvalTransformation(ByVal img As Image) as Image")
        sCode.AppendLine(vbTab & vbTab & vbTab & "Try")
        sCode.AppendLine()
        sCode.AppendLine(cmd)
        sCode.AppendLine()
        sCode.AppendLine(vbTab & vbTab & vbTab & "Catch ex As Exception")
        ' En cas d'erreur : console de debug ET renvoie Nothing
        sCode.AppendLine(vbTab & vbTab & vbTab & vbTab & "Debug.WriteLine(ex.Message)")
        sCode.AppendLine(vbTab & vbTab & vbTab & vbTab & "Return Nothing")
        sCode.AppendLine(vbTab & vbTab & vbTab & "End Try")
        sCode.AppendLine(vbTab & vbTab & "End Function")
        sCode.AppendLine(vbTab & "End Class")
        sCode.AppendLine("End Namespace")
        ' Code de la classe dans la console de debug
        Debug.WriteLine(sCode.ToString())

        ' Résultat de la compilation
        Dim cResult As CodeDom.Compiler.CompilerResults = vbCodeProv.CompileAssemblyFromSource(cParam, sCode.ToString())
        If cResult.Errors.Count > 0 Then
            Dim Errors As String = "Erreur(s) : "
            For Each ce As CodeDom.Compiler.CompilerError In cResult.Errors
                Errors &= vbCrLf & ce.ErrorText
            Next ce
            MsgBox(Errors)
            Return Nothing
        Else
            ' Récupération de l'assembly généré
            Dim myAssembly As System.Reflection.Assembly = cResult.CompiledAssembly
            ' Instanciation de EvalVbCode
            Dim oEvalVbCode As Object = myAssembly.CreateInstance("Divad.EvalVbCode")
            ' Récupération du type de EvalVbCode
            Dim tEvalVbCode As Type = oEvalVbCode.GetType()
            ' Récupération de la méthode EvalTransformation
            Dim methodEvalTrans As Reflection.MethodInfo = tEvalVbCode.GetMethod("EvalTransformation")
            ' Invocation de la méthode EvalTransformation
            Dim myImage As Image = methodEvalTrans.Invoke(oEvalVbCode, New Object() {img})
            Return myImage
        End If
    End Function

 Conclusion

Cette technique, au final assez simple à mettre en place, peut être utilisée pour beacoup de choses... Je vous laisse faire courir votre imagination !

Vous trouverez une explication plus détaillée à cette adresse : http://www.laumaille.net/2007/12/19/evaluationexec ution-dune-chaine/

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

28 décembre 2007 08:39:07 :
Ajout de l'URL vers l'explication complète.

 Sources de la même categorie

Source avec Zip Source avec une capture INTERAGIR AVEC LES USAGERS ...SANS UTILISER DES 'ALERTS' par marcelsnews
Source avec Zip MODIFICATION DYANAMIQUE DES PARAMÈTRES D'UNE FONCTION D'UN [... par marcelsnews
Source avec Zip Source avec une capture JSON PARSER - ANALYSE DE CHAINES JSON par Renfield
Source avec Zip CREATION DE GADGET EN VB6 par djebbipgm
Source avec Zip Source avec une capture CAPTEUR DE HANDLE, DE TITRE, DE CLASS, DE POSITION DE TAILLE... par Sechaud

 Sources en rapport avec celle ci

Source avec Zip Source .NET (Dotnet) XGBLENDERCOMPRESSOR par XelectroX
Source avec Zip Source avec une capture Source .NET (Dotnet) GESTION DE DONNÉES AVEC ACCESS par fradimed
Source avec Zip ANTENNE YAGI - CONCEPTION par johndave
Source .NET (Dotnet) EXÉCUTER DU CODE VB.NET À PARTIR D'UN PROGRAMME EN COURS D'E... par eldim
Source avec Zip Source avec une capture Source .NET (Dotnet) IMPORTER UNE ASSEMBLY (DLL OU EXE) .NET ET NAVIGUER SES MEMB... par werdDomain

Commentaires et avis

Commentaire de Kite37 le 28/12/2007 10:56:50 8/10

En cherchant "vbcodeprovider" sur msdn, on retrouve ton code quasiment a l'identique.

En tout cas merci de l'avoir posté ici, c'est exactement ce que je cherchais :)

L'exemple que tu nous fournis est assez sympa en plus, et le morceau de code où tu ajoute dynamiquement des éléments au menu est intéressant .

8/10

Cordialement, KiTe.

Commentaire de divadav le 28/12/2007 11:11:21

Merci.

Il me semble quand même que le code est assez différent, mais de toute façon, j'utilise le même objet et ses propriétés ne changent pas !!
Et puis je pense surtout que cet exemple est plus "accessible", plus compréhensible pour un débutant que ce qui est donné sur la MSDN...

Commentaire de Kite37 le 28/12/2007 11:13:58

oui tout à fait, c'est bien pour cela que je trouve ton exemple sympa et que je te met 8/10 :)

Ton code reprend MSDN et va un peu plus loin, mais c'est "dans les grandes lignes le même", c'est plutôt ça que j'aurais du dire.

Cordialement, KiTe.

Commentaire de BadoqueAlex le 30/12/2007 04:13:30

C'est incroyable ce que ce morceau de code peut représenter ...
Il pourrait nous permettre de tester un morceau de code d'un programme, indépendament de la compilation de tout le reste dans un environnement vierge .. et dépourvu de bugs, afin d'en comprendre le fonctionnement et les erreurs évantuelles avant intégration au projet final ... Super ! 9/10

Commentaire de EMMANUELTAVE le 02/01/2008 20:59:54

je cherchais justement a passer mon application de Vb6 en Visual 2005.
Voir le post : http://www.vbfrance.com/infomsg_SCRIPTCONTROL-VSA-CODEDOM_1054570.aspx

j'essaie de faire une programme qui pourrais dire :

Imports System
Module Script
    Public Sub Main()
     msgbox("hjkh")
     msgbox(5*2)
    End Sub
End Module

le gestionnaire de programme me dit que la ligne 5 et 6 ne sont pas declaré !!!

merci de votre aide

Commentaire de divadav le 03/01/2008 07:53:31

Si je ne me trompe pas, il faut mettre Microsoft.VisualBasic.dll en référence, puis importer System.VisualBasic (ou System.VisualBasic.Interaction) pour avoir accès à la fonction MsgBox().
Mais il faut bien garder à l'esprit que cette fonction n'existe que pour garder une forme de compatibilité entre VB.Net et VB6, comme tout ce qui se trouve sous Microsoft.VisualBasic.
En .Net pur, il vaut mieux utiliser System.Windows.Forms.MessageBox.Show() (avec à peu près les même paramètres qu'en VB6).
De même, l'utilisation de modules est déconseillée en VB.Net, il vaut mieux créer une classe ! ;)

En espérant avoir pu t'aider !

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

evaluer une chaine de String en commende avec vb.net [ par souma86 ] J'ai un projet à travailler avec le vb.net. Dans mon code, l'utilisateur doit avoir la possibiliter d'entrer une expression dans un textbox (chaine) e connexion reflection ftp [ par jlppap ] Bonjour,j'espère ne pas m'être trompé de forum pour ma question, sinon...  toutes mes excuses.Je suis sous XP pro; avec Reflection je voudrais accéder Générer une class VB.Net [ par veler ] Bonjours, J'ai créée un concepteur de form en VB.Net 2008 (DesignSurface, IDesignerHost...etc). Il fonction plutôt bien. J'aimerais pouvoir enregistre Cadrer une chaine de carractére avec numérique [ par tolt ] Bonjour,Avez-vous svp la solution pour que dans une ListBox ma chaine Additem soit bien cadrée sans passer par une police Courrier ? Exemple ci-dessou Plusieurs fonctions en une [ par PatBlarg ] Bonjour, je veux me créer une bibliothèque de fonctions qui vont me servir dans plusieurs projets, et afin de simplifier le tout, je me demande si il VBA et police 128 sous WORD [ par nicus88 ] Bonjour,Je cherche a mettre en œuvre un code barre 128 sur mes documents Word.Je dispose de la police 128 et d'une fonction.Cette fonction prend en en [VBA] Sélectionner plusieurs colonnes par variable chaine [ par Aurelangelo ] Bonjour les internautes,Je rencontre une petite difficulté au niveau de mon script VBA qui a pour but de créer une série de graphiques  en fonction du Ma chaine sql est incorrecte [ par beegeezzz ] Bonsoir tout le monde,J'ai un problème avec ma chaine sql en VB :Set rsTable = BDOuvrirTable("SELECT * FROM clients WHERE login = "" " &amp; login &am Comparaison char entre Word et Excel [ par zenzolarticho ] Bonjour a tous!J'ai des connaissances assez basique en VB, j'ai réalisé quelques macro par ci par la, mais la je bloque totalement!!Je sollicite donc Convertir valeur date LDAP (100 nanosecondes depuis 1/1/1601) en date [ par dareman ] bonjour,lors de mon stage en entreprise je suis amené à récupérer un champ d'active directory ( outil administration réseau) je programme en visual ba


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mars 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

 
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 : 0,749 sec (3)

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