Accueil > > > EVALUER/EXECUTER UNE CHAINE EN TANT QUE CODE
EVALUER/EXECUTER UNE CHAINE EN TANT QUE CODE
Information sur la source
Description
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/
Historique
- 28 décembre 2007 08:39:07 :
- Ajout de l'URL vers l'explication complète.
Sources de la même categorie
Commentaires et avis
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 = "" " & 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
|
Derniers Blogs
[RIA SERVICES] INCLUDE ET DOMAINDATASOURCE[RIA SERVICES] INCLUDE ET DOMAINDATASOURCE par Audrey
Dans un de mes articles précédents , j'avais parlé des DomainDataSource avec RIA Services dans le cas d'une interface Maître - Détail. Dans le même principe, je vais parler d'une autre manière de mettre en forme ce cas d'interface avec RIA Services. Et po...
Cliquez pour lire la suite de l'article par Audrey ZUNE : VERSION ZUNE SOFTWARE V 4.2 ET LA SOCIALISATIONZUNE : VERSION ZUNE SOFTWARE V 4.2 ET LA SOCIALISATION par ROMELARD Fabrice
Une des nouveautés de la version V 3.0 était l'apparition de l'onglet Social qui ne fonctionnait que si le MarketPlace était activé sur son poste. Cela limitait donc son intérêt, car hors du cadre commercial USA-CANADA, peu de monde trouva...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice PRATIQUE DE SILVERLIGHT PAR ERIC AMBROSIPRATIQUE DE SILVERLIGHT PAR ERIC AMBROSI par MPOWARE
Je viens de finir la lecture du dernier livre d'
Eric Ambrosi
éditions PEARSON
Son livre donne une approche pratique de Silverlight qui sera aussi bien comprise par le développeur que par le designeur.
Tous les aspects du développement RIA sont abor...
Cliquez pour lire la suite de l'article par MPOWARE APPRENDRE à DéVELOPPER POUR LES MOBILES AVEC LA NOUVELLE GéNéRATION .NETAPPRENDRE à DéVELOPPER POUR LES MOBILES AVEC LA NOUVELLE GéNéRATION .NET par odewit
2 déclinaisons de Silverlight et 2 déclinaisons de Mono permettent dorénavant (ou permettront prochainement) de développer des applications .NET mobiles pour les principales plates-formes du marché :
Silverlight pour Symbian, basé sur Silverlight 2...
Cliquez pour lire la suite de l'article par odewit ZUNE : NOUVELLE VERSION DU ZUNE SOFTWARE - V 4.2ZUNE : NOUVELLE VERSION DU ZUNE SOFTWARE - V 4.2 par ROMELARD Fabrice
Avec la dernière génération du lecteur MP3 de Microsoft, le ZUNE HD, Microsoft a publié une nouvelle version du logiciel pour PC. Ainsi, je me suis décidé à installer celle-ci sur mon Tablet PC ACER, comme toujours le logiciel est donc tél...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice
Logiciels
Academy System (10.9.4.0)ACADEMY SYSTEM (10.9.4.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System Xilisoft Convertisseur Vidéo Ultimate (5.1.39.0305)XILISOFT CONVERTISSEUR VIDéO ULTIMATE (5.1.39.0305)Xilisoft Convertisseur Vidéo Ultimate est un outil puissant de conversion vidéo, facile à utilise... Cliquez pour télécharger Xilisoft Convertisseur Vidéo Ultimate Xilisoft DVD Ripper Ultimate (5.0.64.0304)XILISOFT DVD RIPPER ULTIMATE (5.0.64.0304)Xilisoft DVD Ripper Ultimate est un logiciel excellent pour copier et convertir DVD vers presque ... Cliquez pour télécharger Xilisoft DVD Ripper Ultimate Rigs of Rods (63.3)RIGS OF RODS (63.3)c'est un jeu de multi-simulation camions,autobus voitures, avions, bateaux, hélicoptère avec défo... Cliquez pour télécharger Rigs of Rods
|