Accueil > > > EXÉCUTER DU CODE VB.NET À PARTIR D'UN PROGRAMME EN COURS D'EXÉCUTION
EXÉCUTER DU CODE VB.NET À PARTIR D'UN PROGRAMME EN COURS D'EXÉCUTION
Information sur la source
Description
Ce programme à pour but de montrer comment on peut exécuter du code vb.net (ou c#) pendant l'exécution. Ce n'est qu'une façon de procéder parmi d'autres. Pour pouvoir tester ce code il faut : * Créer un formulaire sur lequel on place 2 objets : - un bouton appelé cmdExec - un RichTextBox appelé RTB * Créer une class appelée DynamicCode Si vous souhaitez ajouter une référence à votre code qui est en cours d'exécution il faut l'ajouter au paramètre CP comme suit : CP.ReferencedAssemblies.Add(System.Reflection.As sembly.GetExecutingAssembly.Location) Dans ce cas, il ne faut pas oublié d'ajouter les références liées à votre projet. Exemple : CP.ReferencedAssemblies.Add("System.Windows.Form s.dll") Pour intégrer une gestion d'erreur il faut stocker les messages car il peut y en avoir plusieur à suivre dans la procedure de compilation. On pourrait la retravailler comme suit : Dim CR As CodeDom.Compiler.CompilerResults = CDP.CompileAssemblyFromSource(CP, sCodeSource) Try Return CR.CompiledAssembly Catch ex As Exception For i As Integer = 0 To CR.Errors.Count - 1 'procedure contenant un RichTextBox sur lequel on ajoute les messages d'erreur addMessage(CR.Errors.Item(i).ErrorText) Next Return Nothing End Try
Source
- Public Class DynamicCode
- ''' <summary>
- ''' Compilation de code vb.net
- ''' </summary>
- ''' <param name="sCodeSource">code source</param>
- ''' <returns>assembly</returns>
- ''' <remarks>nécessite le chargement de l'assembly pour l'exécution</remarks>
- Public Shared Function compile(ByVal sCodeSource As String) As System.Reflection.Assembly
- Dim CP As CodeDom.Compiler.CompilerParameters = New CodeDom.Compiler.CompilerParameters()
- CP.ReferencedAssemblies.Add("System.dll")
- CP.GenerateExecutable = False
- Return compile(CP, sCodeSource)
- End Function
-
- ''' <summary>
- ''' Compilation de code vb.net
- ''' </summary>
- ''' <param name="CP">imports, génération d'exe ...etc</param>
- ''' <param name="sCodeSource">code source</param>
- ''' <returns>assembly</returns>
- ''' <remarks>nécessite le chargement de l'assembly pour l'exécution</remarks>
- Public Shared Function compile(ByVal CP As CodeDom.Compiler.CompilerParameters, ByVal sCodeSource As String) As System.Reflection.Assembly
- Dim CDP As CodeDom.Compiler.CodeDomProvider = New VBCodeProvider()
- Return compile(CDP, CP, sCodeSource)
- End Function
-
- ''' <summary>
- ''' compilation de code
- ''' </summary>
- ''' <param name="CDP">vb.net, c# ou autre</param>
- ''' <param name="CP">imports, génération d'exe ...etc</param>
- ''' <param name="sCodeSource">code source</param>
- ''' <returns>assembly</returns>
- ''' <remarks>nécessite le chargement de l'assembly pour l'exécution</remarks>
- Public Shared Function compile(ByVal CDP As CodeDom.Compiler.CodeDomProvider, ByVal CP As CodeDom.Compiler.CompilerParameters, _
- ByVal sCodeSource As String) As System.Reflection.Assembly
- Dim CR As CodeDom.Compiler.CompilerResults = CDP.CompileAssemblyFromSource(CP, sCodeSource)
- Return CR.CompiledAssembly
- End Function
- End Class
-
- '----------------------------------------
- 'Code à mettre dans le formulaire
- Private Sub cmdExec_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdExec.Click
- execCode()
- End Sub
-
- Private Sub execCode()
- Me.cmdExec.Enabled = False
- Dim TH As New Threading.Thread(AddressOf execCodeTH)
- TH.Start()
- End Sub
-
- Private Sub execCodeTH()
- Try
- Threading.Thread.Sleep(1)
- Dim S As String = "Imports System" & vbCrLf & "Class TestClass" & vbCrLf & "Public Shared Sub testSub()" & vbCrLf
- S &= RTB.Text
- S &= vbCrLf & "End Sub" & vbCrLf & "End Class"
- Dim A As System.Reflection.Assembly = DynamicCode.compile(S)
- If Not A Is Nothing Then
- Dim T As Type = A.GetType("TestClass")
- Dim M As System.Reflection.MethodInfo = T.GetMethod("testSub")
- M.Invoke(Nothing, Nothing)
- End If
- Catch ex As Exception
- 'Gestion d'erreur à faire en fonction de votre programme
- msgbox(ex.Message)
- End Try
- Me.cmdExec.Enabled = True
- End Sub
- '----------------------------------------
Public Class DynamicCode
''' <summary>
''' Compilation de code vb.net
''' </summary>
''' <param name="sCodeSource">code source</param>
''' <returns>assembly</returns>
''' <remarks>nécessite le chargement de l'assembly pour l'exécution</remarks>
Public Shared Function compile(ByVal sCodeSource As String) As System.Reflection.Assembly
Dim CP As CodeDom.Compiler.CompilerParameters = New CodeDom.Compiler.CompilerParameters()
CP.ReferencedAssemblies.Add("System.dll")
CP.GenerateExecutable = False
Return compile(CP, sCodeSource)
End Function
''' <summary>
''' Compilation de code vb.net
''' </summary>
''' <param name="CP">imports, génération d'exe ...etc</param>
''' <param name="sCodeSource">code source</param>
''' <returns>assembly</returns>
''' <remarks>nécessite le chargement de l'assembly pour l'exécution</remarks>
Public Shared Function compile(ByVal CP As CodeDom.Compiler.CompilerParameters, ByVal sCodeSource As String) As System.Reflection.Assembly
Dim CDP As CodeDom.Compiler.CodeDomProvider = New VBCodeProvider()
Return compile(CDP, CP, sCodeSource)
End Function
''' <summary>
''' compilation de code
''' </summary>
''' <param name="CDP">vb.net, c# ou autre</param>
''' <param name="CP">imports, génération d'exe ...etc</param>
''' <param name="sCodeSource">code source</param>
''' <returns>assembly</returns>
''' <remarks>nécessite le chargement de l'assembly pour l'exécution</remarks>
Public Shared Function compile(ByVal CDP As CodeDom.Compiler.CodeDomProvider, ByVal CP As CodeDom.Compiler.CompilerParameters, _
ByVal sCodeSource As String) As System.Reflection.Assembly
Dim CR As CodeDom.Compiler.CompilerResults = CDP.CompileAssemblyFromSource(CP, sCodeSource)
Return CR.CompiledAssembly
End Function
End Class
'----------------------------------------
'Code à mettre dans le formulaire
Private Sub cmdExec_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdExec.Click
execCode()
End Sub
Private Sub execCode()
Me.cmdExec.Enabled = False
Dim TH As New Threading.Thread(AddressOf execCodeTH)
TH.Start()
End Sub
Private Sub execCodeTH()
Try
Threading.Thread.Sleep(1)
Dim S As String = "Imports System" & vbCrLf & "Class TestClass" & vbCrLf & "Public Shared Sub testSub()" & vbCrLf
S &= RTB.Text
S &= vbCrLf & "End Sub" & vbCrLf & "End Class"
Dim A As System.Reflection.Assembly = DynamicCode.compile(S)
If Not A Is Nothing Then
Dim T As Type = A.GetType("TestClass")
Dim M As System.Reflection.MethodInfo = T.GetMethod("testSub")
M.Invoke(Nothing, Nothing)
End If
Catch ex As Exception
'Gestion d'erreur à faire en fonction de votre programme
msgbox(ex.Message)
End Try
Me.cmdExec.Enabled = True
End Sub
'----------------------------------------
Conclusion
Le choix est ici porté sur l'exécution directe du code Mais on peut très bien choisir de tout rendre paramétrable (Namespace, Class, Sub etc...)
Pour tester on peut exécuter la commande suivante (en ayant un fichier C:\A.txt) : System.IO.File.Copy("C:\A.txt","C:\B.txt")
Historique
- 29 juillet 2008 10:53:08 :
- erreur de saisie
- 29 juillet 2008 10:56:48 :
- suppression de ma gestion d'erreur non traitée ici
- 30 juillet 2008 08:37:37 :
- Ajout de commentaires sur les références et les erreurs
Sources du même auteur
Sources de la même categorie
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
[vb.net]CodeDom [ par shadow1779 ]
j'ai essayer d'utiliser codedom, en faisant un petit test simple, tout a l'air de marcher , aucune erreur n'est retournée , mais il n'y a pas d'&
VB.net system.outofmemoryexception [ par grand prophete ]
Bonjour Voila, mon appplication utilise plusieurs threads (9 en tout) et lorsque je la démarre j'ai ce message d'erreur, mais une fois démarré et le m
Thread avec vb6 [ par hihello ]
comme j'ai lu, il n'est pas préférable de coder un prj contenant les threads avec vb6. Mais, est ce qu'il existe des ocx,activex (ou un autre solution
Version Assembly & Version fichier [ par skowee59 ]
Dans VB2005, lorsqu'on clique sur le bouton "Informations de l'assembly..." de l'onglet "Application" de "My project" (explorateur de solutions), on a
Très urgent compiler mon usercontrol.... [ par lex1111 ]
Salut, j'aimerais compiler le usercontrole que j'ai trouvé sur vbfrance et que j'ai modifié un peu...J'aimerais le passer de ".ctl" a ".ocx" pour le j
assembly.GetManifestResourceStream [ par romagny13 ]
Bonjour voila jai quelques difficultés a comprendre ce code Public
Cross-Thread Operation non-valid [ par EricNRC ]
Bonjour Tout d'abord Bonne journée à tous! Je tente de programmer avec VB 2005 express et je me bute a une sérieux problèmeJ'aimerais savoir s'il exis
Aidez moi à comprendre la procedure suivante svp [ par VTwin ]
Salut tout le monde,Voila j'ai recupéré la procedure suivante que j'ai adapté à ma sauce. elle permet de lister tout les fichiers avec l'extension sou
VB.net : compiler un .vb en .exe lisible par tous [ par early_reflexions ]
Salut à tous.Je suis un débutant absolu en visual basic. J'ai eu une version Visual basic .net et j'aurais besoin de faire un programme qui soit lisib
Compiler un prog VB.Net avec un autre [ par OneHacker ]
Salut à tous ! Je voudrais savoir si il était possible de compiler 2 programmes(déjà compilés).Par exemple, un Setup Compilé avec un Logiciel de façon
|
Derniers Blogs
L'INTERFACE NATURELLE DE WINDOWS PHONE 7 SERIESL'INTERFACE NATURELLE DE WINDOWS PHONE 7 SERIES par odewit
La tendance est aux interfaces naturelles (NUI), et le keynote de Bill Buxton au MIX l'a bien souligné.
La charte graphique et ergonomique de Windows Phone 7 a donc été entièrement repensée en vue d'obtenir un maximum d'efficacité sur ce point. En re...
Cliquez pour lire la suite de l'article par odewit COMMENT MAPPER UNE VUE SQL SUR UNE COLLECTION DE COMPLEX TYPE?COMMENT MAPPER UNE VUE SQL SUR UNE COLLECTION DE COMPLEX TYPE? par Matthieu MEZIL
Avec EF, les vues doivent être mappées sur des entity types. Le problème c'est que les entity types doivent avoir une clé. Avec EF, nous avons les complex type qui n'ont pas de clé mais les vues ne peuvent pas être mappées dessus. Avec EF4, il est possibl...
Cliquez pour lire la suite de l'article par Matthieu MEZIL [WF4] UN BINDING ACTIVITY/ACTIVITYDESIGNER QUI PASSE MAL?[WF4] UN BINDING ACTIVITY/ACTIVITYDESIGNER QUI PASSE MAL? par JeremyJeanson
Certain d'entre vous on peut être vécu cette situation embarrassante après quelques temps passer avec WF4 : Au début avec mon " ActivityDesigner" , tout allait bien. Et puis un jour j'ai au des problèmes de " Binding" . Alors nous sommes allé sur le site ...
Cliquez pour lire la suite de l'article par JeremyJeanson
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
|