begin process at 2010 03 21 02:39:39
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Exécution

 > 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

Note :
8,5 / 10 - par 2 personnes
8,50 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Exécution Source .NET ( DotNet ) Classé sous :CodeDom, Reflexion, Thread, Assembly, Compiler Niveau :Initié Date de création :29/07/2008 Date de mise à jour :30/07/2008 08:37:37 Vu :4 500

Auteur : eldim

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

 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

Source .NET (Dotnet) RECTANGLES ARRONDIS
Source .NET (Dotnet) RÉCUPÉRER LE NOM DU PC CONNECTÉ À UN SERVEUR EN TERMINAL SER...
Source .NET (Dotnet) EXÉCUTION D'UN THREAD SANS SURCHARGER LE PROCESSEUR
Source avec Zip Source avec une capture Source .NET (Dotnet) EXÉCUTION DE COMMANDES (DOS) SUR UNE PLAGE IP
Source avec Zip Source avec une capture Source .NET (Dotnet) RECHERCHE AVANCÉE DE FICHIERS PLUS RAPIDE QUE CELLE DE WINDO...

 Sources de la même categorie

Source avec Zip APPEL DE POINTEUR DE FONCTIONS - API SANS LES DECLARER par Renfield
Source avec Zip Source avec une capture RETROUVER LES DONNÉES PUBLIQUES DANS UNE BIBLIOTHÈQUE par VBsearch
Source avec Zip Source avec une capture CRÉER VOTRE PROGRAMME D'INSTALLATION par VBsearch
Source avec Zip Source avec une capture BART VOTRE BUREAU DANS UNE BARRE par alfamick
Source avec Zip Source avec une capture Source .NET (Dotnet) SIMPLE SHUTDOWN SCHEDULER : ARRÊTS PLANIFIÉS (LOCAL OU REMOT... par violent_ken

 Sources en rapport avec celle ci

Source avec Zip Source .NET (Dotnet) MULTI THREAD AVEC AFFICHAGE par jaknight007
Source avec Zip Source avec une capture Source .NET (Dotnet) GÉNÉRATEUR D'IMAGES ALÉATOIRES UTILISANT LES THREADS - THREA... par COCSoftwareViva
Source avec Zip Source avec une capture Source .NET (Dotnet) TRI AVEC VISUALISATION par xave4552
Source .NET (Dotnet) BACKGROUNDWORKER RAFRAÎCHISSEMENT DU FORMULAIRE PENDANT LA T... par fifrelin70
Source avec Zip Source .NET (Dotnet) XGBLENDERCOMPRESSOR par XelectroX

Commentaires et avis

Commentaire de gillardg le 29/07/2008 15:37:35

résultat :

Opération inter-threads non valide : le contrôle 'cmdExec' a fait l'objet d'un accès à partir d'un thread autre que celui sur lequel il a été créé.

Commentaire de gillardg le 29/07/2008 15:46:55

problème résolu :
  Private Sub execCode()
        Me.cmdExec.Enabled = False
   '  Dim TH As New Threading.Thread(AddressOf execCodeTH)
   ' TH.Start()
        execCodeTH()
    End Sub

Commentaire de eldim le 29/07/2008 16:24:22

non c'est juste qu'il faut autoriser le multithreading
comme je l'ai par défaut j'ai pas pensé à le signaler...
Control.CheckForIllegalCrossThreadCalls = False

Commentaire de gillardg le 29/07/2008 16:37:03 9/10

bon 9/10
si tu veux j'ai une calculette qui fonctionne sur le même principe

Commentaire de eldim le 29/07/2008 16:56:35

lol, rappel : le but c'est l'exécution de code dynamique...
le multi-thread est ici utiliser pour éviter de saturer l'application sans saturé le processeur pendant l'exécution d'un code lent...
Mais si tu préfère le monothread c'est ton choix...

Commentaire de gillardg le 29/07/2008 17:09:52

saturer le cpu : faut déjà y aller
le calcul des nombres premiers jusqu'à long.max
ça sature même pas (bof : 50%)

Commentaire de eldim le 29/07/2008 17:15:23

(je parlais en doevents à la place du multithread pour rafraichir l'affichage, par pour ton appli de calculette...)

Commentaire de eldim le 29/07/2008 17:16:07

oh la y a de la fatigue dans l'air... j'ai mis le "par" à la place de "pas"

Commentaire de gillardg le 29/07/2008 17:27:40

7 rien fait trop chaud pour travailler

il n'y a pas de code lent, il n'y a que de mauvais algo
:-)

Commentaire de haitham101 le 29/01/2009 10:50:50 8/10

slt eldim trés bon travaille
mais jé un probleme
j'ai mis dans mon RichTextBox une instruction vb.net (2005) qui change la proprieté txt d'un label,
au moment ke j'appele le code une erreur s'affiche qu'il manque une dll
et a chaque click de cmdExec il me demande tout a fait une autre dll, et cé pareille pour chaque instruction qui touche un composant.
vous pouvez m'aider svp.
merci d'avance


Commentaire de eldim le 29/01/2009 12:20:26

salut,
il te faut rajouter la dll du winform en référence :
CP.ReferencedAssemblies.Add("System.Windows.Forms")

Commentaire de haitham101 le 01/02/2009 12:04:27

slt eldim
merci pour la répense mais le probleme sa ce pose toujours.
voila ce qui ce passe exactement,j'ai mis un label1 "L1" sur le form, je veux agir sur sa propriété text et là changer, je mis dans mon RTB:
L1.text="moi"
(si ca te derange pas essaie le)
le message d'erreur qui s'affiche est:
""""""""""Impossible de charger le fichier ou l'assembly'file:///C:\Documents and Settings\..\LocalSettings\Temp\*****.dll'
ou une de ses dépendances.le fichier spécifié est introuvable.""""""""""""""""
les etoiles que j'ai mis avant .dll ca veux dire a chaque fois que je click mon boutton il me demande une dll différente ke la fois precédente.
jé mis :
CP.ReferencedAssemblies.Add("System.Windows.Forms")
ca marche pas toujours le meme message d'erreur
dans le besion de votre aide svp;
cé extraiment urgent.
merci.

Commentaire de haitham101 le 04/02/2009 10:23:01

slt eldim
por quoi il ya pas de réponse J'ai besoin vraiment de ton aide.
Je travaille avec  le framwork 2.0
Peut être c'est ca.

Commentaire de eldim le 04/02/2009 11:14:26

salut,
non c'est pas ça moi aussi suit en frameworks 2
désolé j'ai pas trop le temps en ce moment avec le boulot et le reste...
vérifie peut-être du coté de ton antivirus ou des droits

Commentaire de haitham101 le 04/02/2009 12:45:35

desolé si je dérange eldim
mais ces vraiment trés important,
est ce que ca a marché avec toi d'agir sur des controles d'un meme form ou d'autres form;
tu as essaie ce que je té envoyé,
dans le besion de votre aide une autre fois.

Commentaire de haitham101 le 08/02/2009 12:22:35

slt eldim
pas de répense encore
merci de toute façon,malgré que j'ai besion de votre aide.

Commentaire de haitham101 le 15/02/2009 10:10:08

SLT eldim
je suis toujours coincé tu peut m'aider
merci.........................

Commentaire de eldim le 16/02/2009 08:01:23

je viens de relire ta question... logiquement ce n'est pas comme ça qu'il faut utiliser le source... :
tu dois créer ton formulaire dynamiquement dans le RTB et créer le label associé. Pas mettre ton label sur le même form que la où tu déclare ton code... C'est comme si tu essayais de créer un formulaire dans l'éditeur VB et que tu ne comprenais pas pourquoi il ne marchait pas pendant que tu édite le code... Bref :
dim FRM as new system.windows.forms.form
dim L1 as new system.windows.forms.label
frm.controls.add L1
L1.Text = "toi"

 Ajouter un commentaire


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&#233;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


Nos sponsors


Sondage...

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,842 sec (3)

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