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
SESSION SILVERLIGHT 5 3D : SLIDES ET DEMOSSESSION SILVERLIGHT 5 3D : SLIDES ET DEMOS par Groc
Durant les techdays, j'ai eu le plaisir d'animer une session sur Silverlight 5 et la 3D avec Simon Ferquel. Comme promis, voici nos slides et mes démos (celles avec le viper BSG) ici et là. Pour mémoire, les démos utilisent toutes le viper BSG...
Cliquez pour lire la suite de l'article par Groc [TECHDAYS 2012] SESSION WEBMATRIX 2 : LE COUTEAU SUISSE GRATUIT POUR VOS DéVELOPPEMENTS WEB - SLIDES[TECHDAYS 2012] SESSION WEBMATRIX 2 : LE COUTEAU SUISSE GRATUIT POUR VOS DéVELOPPEMENTS WEB - SLIDES par gpommier
Suite à la session que j'ai présenté sur WebMatrix 2, vous pouvez trouver les slides ici, ainsi que les démos en packages nuget : démos1 et démos2 J'en profite pour remercier chaleureusement tous ceux qui sont venus très nombreux à cette sess...
Cliquez pour lire la suite de l'article par gpommier [SHAREPOINT] LES SESSIONS TECHDAYS 2012.[SHAREPOINT] LES SESSIONS TECHDAYS 2012. par Patrick Guimonet
Voici donc pour ceux qui n'ont pas pu venir, ou ceux qui n'ont pas pu toutes les suivre la liste des sessions SharePoint aux TechDays 2012, que je mettrais à jour dès que les liens des vidéo seront disponibles. Ou ici : http...
Cliquez pour lire la suite de l'article par Patrick Guimonet TECHDAYS PARIS 2012 : SESSION PLEINIèRE JOUR 3TECHDAYS PARIS 2012 : SESSION PLEINIèRE JOUR 3 par ROMELARD Fabrice
Speaker: Bernard Ourghanlian Cette session est comme chaque jour transmise en live par BrainSonic, et j'ai donc suivi cette troisième pleinière par ce moyen sur mon iPad . Elle est dédiée comme chaque année à la mise en perspective de l'é...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice MISHRA READER : UN LECTEUR RSS TRèS ZUNE STYLE EN OPEN SOURCE !MISHRA READER : UN LECTEUR RSS TRèS ZUNE STYLE EN OPEN SOURCE ! par Vko
Hier durant une session dédiée aux Techdays 2012, j'ai eu le plaisir d'annoncer la sortie de la Béta 2 de Mishra Reader. C'est quoi ? Pour les utilisateurs, c'est une vraie expérience de lecture de flux RSS sur Windows. Rien à voir avec les produit...
Cliquez pour lire la suite de l'article par Vko
Logiciels
Tribler (2012)TRIBLER (2012)Tribler est un client pair à pair (P2P/Peer-to-Peer) open source avec la capacité de regarder des... Cliquez pour télécharger Tribler OneSwarm (2012)ONESWARM (2012)Le peer-to-peer qui protège votre vie privée, c'est OneSwarm.
Ce logiciel de peer-to-peer crypté... Cliquez pour télécharger OneSwarm PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V8.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V8.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO Academy System (17.2.1.0)ACADEMY SYSTEM (17.2.1.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System Easy-Planning (1.0.0.1)EASY-PLANNING (1.0.0.1)Basé sur les mêmes principes que MyPlanning, Easy-Planning permet de créer des plannings sous la ... Cliquez pour télécharger Easy-Planning
|