Il y a 40 utilisateurs connus et inconnus. Pour voir la liste des connectés connus, cliquez ici

 Mot :   Pseudo :  
 
Bas de page
Auteur
 Sujet :

VB.NET : instancier une classe d'après son nom

 
n°56716
LostSoul
Manieur de hache
Posté le 20-03-2007 à 11:58:05  profilanswer
 

J'explique un peu ce que j'essaye de tenter d'arriver à essayer de faire
1- j'ai un fichier xml qui liste une série de noms de classes  
2- les classes sont définies dans mon application
3- j'aimerais pouvoir instancier les classes en fonction des noms lus dans le fichier XML, mais en direct
 
(Le but est d'arriver à une application customisable via un fichier de config, chaque classe étant un module qui est affiché dans un framework mdi)
 
En gros j'ai ca
 

<modules>
  <module class="GPS3_TestModule">
   <title>Module de test</title>
   <parameters/>
  </module>
  <module class="GPS3_GPSModule">
   <title>GPS</title>
   <parameters/>
  </module>
 </modules>


 
que je charge comme ca
 

       xmlConfig.Load(My.Settings.ConfigFile)
        parent = menuAnchorModules.GetCurrentParent()
        positionAfter = parent.Items.IndexOf(menuAnchorModules)
        i = 1
        For Each xmlElement In xmlConfig.GetElementsByTagName("module" )
            moduleClassName = xmlElement.Attributes("class" ).Value.ToString()
            moduleName = xmlElement.Item("title" ).InnerText
 
            moduleReference = New TestModule '<=== ICI SE TROUVE LE PROBLEME
             
            If moduleReference.Equals(Nothing) Then
                Debug.WriteLine("Failed to create new instance for module " & moduleName)
                log.appendToLog("Failed to load module """ & moduleName & """ (Class " & moduleClassName & " )" )
            Else
                moduleReference.setDBWrapper(dbc)   'links to the database connector
                moduleReference.setParentWindow(Me) 'links mdi child to main window
 
                'adds item inside the modules menu
                item = New ToolStripButton(moduleName)
                item.Enabled = False
                item.Name = moduleClassName
                parent.Items.Insert(positionAfter + i, item)
                moduleReference.setMenuItem(item)   'links module to its menu entry                
                i += 1
 
                itemHelp = New ToolStripButton(moduleName)
                itemHelp.Name = moduleClassName & "_Help"
                modulesHelp.DropDownItems.Insert(i - 1, itemHelp)
            End If
            moduleStack.Add(moduleClassName, moduleReference)
 
        Next


 
en gros moduleReference doit recevoir la référence d'une nouvelle instance de la classe dont le nom est contenu dans moduleClassName
 
Qqun a une idée ? :p


Message édité par LostSoul le 20-03-2007 à 11:58:27

---------------
In Girum Imus Nocte Et Consumimur Igni
In-Wonderland - Blog - Start64
n°56717
sebx
boulet cherche canon
Posté le 20-03-2007 à 12:11:11  profilanswer
 

trouvé ça en C#, ça marche p'têt en VB  :p
 

Code :
  1. public static object GetInstance(Assembly a, string className)
  2. {
  3.     try
  4.     {
  5.         Type t = a.GetType(className);     
  6.         return Activator.CreateInstance(t);
  7.     }
  8.     catch (ArgumentNullException) { return null; } // Type non trouvé
  9. }
  10. //Exemple d'utilisation  
  11. object o = GetInstance(Assembly.GetExecutingAssembly(), "Namespace.MaClasse" );


---------------
Célibataire & béhémiste de service
Gentil Organisateur des rencontres matbe
JH 27 ans, bon salaire, propriétaire, roulant en berline Allemande cherche femme pour mariage, bébés et + si affinités
n°56718
castor@mat​be
Mutafukaz !
Posté le 20-03-2007 à 12:12:44  profilanswer
 

Euh un truc comme ça ça pourrait correspondre à ton besoin (J'ai rien sous la main alors je suis pas sur d'avoir bien compris ce que ça fait)
CallByName Function


---------------
Blog
n°56719
sebx
boulet cherche canon
Posté le 20-03-2007 à 12:15:05  profilanswer
 

tu peux aussi regarder du côté de la classe Activator apparemment  :p


---------------
Célibataire & béhémiste de service
Gentil Organisateur des rencontres matbe
JH 27 ans, bon salaire, propriétaire, roulant en berline Allemande cherche femme pour mariage, bébés et + si affinités
n°56720
LostSoul
Manieur de hache
Posté le 20-03-2007 à 12:34:07  profilanswer
 

sebx : ouep j'vais creuser cette voie là.
Après ca me reste plus qu'à trouver comment lier une fonction de ma classe plugin à un event de l'item menu créé pour l'ouvrir :p
 
EDIT : ca meurche :jap: merci m'sieur
 

   Private Function getPluginInstance(ByRef iAssembly As Assembly, ByVal istrType As String) As Object
        Dim t As Type
        Try
            t = iAssembly.GetType(istrType)
            Return Activator.CreateInstance(t)
        Catch ex As ArgumentNullException
            Return Nothing
        End Try
    End Function

Message cité 2 fois
Message édité par LostSoul le 20-03-2007 à 13:03:48

---------------
In Girum Imus Nocte Et Consumimur Igni
In-Wonderland - Blog - Start64
n°56721
castor@mat​be
Mutafukaz !
Posté le 20-03-2007 à 13:44:00  profilanswer
 

LostSoul a écrit :

sebx : ouep j'vais creuser cette voie là.
Après ca me reste plus qu'à trouver comment lier une fonction de ma classe plugin à un event de l'item menu créé pour l'ouvrir :p


Ben tu peux pas le faire par héritage en déclarant un handle de l'event dans ta class plugin ? (cette phrase n'a quasiment aucun sens)


---------------
Blog
n°56722
sebx
boulet cherche canon
Posté le 20-03-2007 à 13:57:02  profilanswer
 

LostSoul a écrit :

sebx : ouep j'vais creuser cette voie là.
Après ca me reste plus qu'à trouver comment lier une fonction de ma classe plugin à un event de l'item menu créé pour l'ouvrir :p
 
EDIT : ca meurche :jap: merci m'sieur
 

   Private Function getPluginInstance(ByRef iAssembly As Assembly, ByVal istrType As String) As Object
        Dim t As Type
        Try
            t = iAssembly.GetType(istrType)
            Return Activator.CreateInstance(t)
        Catch ex As ArgumentNullException
            Return Nothing
        End Try
    End Function



le ByVal cay mal (tm)  :o


---------------
Célibataire & béhémiste de service
Gentil Organisateur des rencontres matbe
JH 27 ans, bon salaire, propriétaire, roulant en berline Allemande cherche femme pour mariage, bébés et + si affinités
n°56723
LostSoul
Manieur de hache
Posté le 20-03-2007 à 14:30:35  profilanswer
 

castor@matbe a écrit :

Ben tu peux pas le faire par héritage en déclarant un handle de l'event dans ta class plugin ? (cette phrase n'a quasiment aucun sens)

 

moui ... euh ... j'vais creuser :p
le but c'est d'appeler une fonction Start() du plugin lors du clic sur l'item de menu (item) créé, même chose pour itemHelp qui doit ouvrir l'aide correspondant au plugin en question.
En gros je dois binder l'event onClick() de item sur une fonction de ma classe moduleReference

Message cité 1 fois
Message édité par LostSoul le 20-03-2007 à 14:31:24

---------------
In Girum Imus Nocte Et Consumimur Igni
In-Wonderland - Blog - Start64
n°56724
sebx
boulet cherche canon
Posté le 20-03-2007 à 14:46:57  profilanswer
 

ce que tu cherches à faire est réalisé en java par le framework Spring (entre autre)
en gros tu déclares dans un fichier xml l'implémentation à utiliser pour tel ou tel service, ensuite lorsque tu appelles le factory de Spring, il te renvoie une instance de l'implémentation choisie mais sous forme d'interface. Donc en gros tu ne manipules que des interfaces, ça te permet de te tamponner le coquillard avec les implémentations.
A ta place j'essayerais de faire un truc comme ça plutôt que de ballader des Object  :/


Message édité par sebx le 20-03-2007 à 14:47:12

---------------
Célibataire & béhémiste de service
Gentil Organisateur des rencontres matbe
JH 27 ans, bon salaire, propriétaire, roulant en berline Allemande cherche femme pour mariage, bébés et + si affinités
n°56725
sebx
boulet cherche canon
Posté le 20-03-2007 à 14:49:57  profilanswer
 

tiens d'ailleurs le framework Spring est dispo pour .net : http://www.springframework.net/


---------------
Célibataire & béhémiste de service
Gentil Organisateur des rencontres matbe
JH 27 ans, bon salaire, propriétaire, roulant en berline Allemande cherche femme pour mariage, bébés et + si affinités
n°56726
castor@mat​be
Mutafukaz !
Posté le 20-03-2007 à 15:01:44  profilanswer
 

LostSoul a écrit :

moui ... euh ... j'vais creuser :p
le but c'est d'appeler une fonction Start() du plugin lors du clic sur l'item de menu (item) créé, même chose pour itemHelp qui doit ouvrir l'aide correspondant au plugin en question.  
En gros je dois binder l'event onClick() de item sur une fonction de ma classe moduleReference


 
Addhandler item.Click, adressof Start
 


---------------
Blog
n°56727
LostSoul
Manieur de hache
Posté le 20-03-2007 à 15:06:55  profilanswer
 

castor@matbe a écrit :

Addhandler item.Click, adressof Start

 

j'vais tester mais ca me semble fort succint ca ...
EDIT: marche pas, il me déclenche la fonction liée au moment du AddHandler et pas quand j'vais cliquer sur l'item dans le menu :p


Message édité par LostSoul le 20-03-2007 à 15:11:17

---------------
In Girum Imus Nocte Et Consumimur Igni
In-Wonderland - Blog - Start64
n°56728
castor@mat​be
Mutafukaz !
Posté le 20-03-2007 à 15:22:17  profilanswer
 

C'est con ça :D


---------------
Blog
n°56729
castor@mat​be
Mutafukaz !
Posté le 20-03-2007 à 15:26:24  profilanswer
 

l'exemple crosoft c'est ça
tu peux test voir si le concept est bon
 

Code :
  1. Sub TestEvents()
  2.     Dim Obj As New Class1
  3.     ' Associate an event handler with an event.
  4.     AddHandler Obj.Ev_Event, AddressOf EventHandler
  5.     ' Call the method to raise the event.
  6.     Obj.CauseSomeEvent()
  7.     ' Stop handling events.
  8.     RemoveHandler Obj.Ev_Event, AddressOf EventHandler
  9.     ' This event will not be handled.
  10.     Obj.CauseSomeEvent()
  11. End Sub
  12. Sub EventHandler()
  13.     ' Handle the event.
  14.     MsgBox("EventHandler caught event." )
  15. End Sub
  16. Public Class Class1
  17.     ' Declare an event.
  18.     Public Event Ev_Event()
  19.     Sub CauseSomeEvent()
  20.         ' Raise an event.
  21.         RaiseEvent Ev_Event()
  22.     End Sub
  23. End Class


---------------
Blog
n°56730
LostSoul
Manieur de hache
Posté le 20-03-2007 à 16:06:35  profilanswer
 

 

J'ai repéré ma faute, effectivement AddHandler ca marche pas mal pour ce que je dois faire :jap:

 

EDIT: bon ben là ils viennent d'avoir la surprise chez Fortis : ils pensaient que la nouvelle appli serait encore web-based pi là ils sont tout déboussolés parce qu'ils ont entrevu le machin que j'code comme proto ...
En gros ca va bien rire à la prochaine réunion entre les gens de Fortis qui sont en train de faire un cahier de charge pour une appli web based et les chefs de vadis poussés par le (sombre crétin) polytechnicien qui leur a fourré .NET 3 / WPF dans la tête.


Message édité par LostSoul le 20-03-2007 à 17:39:34

---------------
In Girum Imus Nocte Et Consumimur Igni
In-Wonderland - Blog - Start64
n°56732
castor@mat​be
Mutafukaz !
Posté le 20-03-2007 à 23:13:57  profilanswer
 

Pis ce qui est bien c'est que c'est pas comme si c'était fondamental comme décision :D


---------------
Blog
n°56733
LostSoul
Manieur de hache
Posté le 20-03-2007 à 23:16:52  profilanswer
 

y'a pire :o


---------------
In Girum Imus Nocte Et Consumimur Igni
In-Wonderland - Blog - Start64
n°56736
sebx
boulet cherche canon
Posté le 21-03-2007 à 10:05:11  profilanswer
 

il me semble que .net 3 / WPF marche aussi en appli web  :p


---------------
Célibataire & béhémiste de service
Gentil Organisateur des rencontres matbe
JH 27 ans, bon salaire, propriétaire, roulant en berline Allemande cherche femme pour mariage, bébés et + si affinités
n°56737
castor@mat​be
Mutafukaz !
Posté le 21-03-2007 à 10:36:32  profilanswer
 

Pour moi WPF c'est une fédération de catch :whistle:


---------------
Blog
n°56738
LostSoul
Manieur de hache
Posté le 21-03-2007 à 11:00:45  profilanswer
 

sebx a écrit :

il me semble que .net 3 / WPF marche aussi en appli web  :p


 
WPF/E (pour Everywhere) ?
anyway, apparemment c'est le polytech qui décide et il a décidé que ce serait pas web ...
en plus ca fait 2 jours que je fais mon proto en VB.NET et là il m'a dit hier avant de partir : "ah mais tu fais ca en VB ? parce que bon "les standards vadis" (huhu je rigole bien parce qu'on est les premiers à les "suivre" en fait) c'est C#" ... :sweat:
 
Donc je recode mon proto en C# là (y'a peu de choses qui changent au final)


---------------
In Girum Imus Nocte Et Consumimur Igni
In-Wonderland - Blog - Start64
n°56742
sebx
boulet cherche canon
Posté le 21-03-2007 à 16:17:55  profilanswer
 

tu rajoutes des ";" et y'a déjà 50% du code qui marche  :D


---------------
Célibataire & béhémiste de service
Gentil Organisateur des rencontres matbe
JH 27 ans, bon salaire, propriétaire, roulant en berline Allemande cherche femme pour mariage, bébés et + si affinités
n°56750
LostSoul
Manieur de hache
Posté le 21-03-2007 à 18:52:32  profilanswer
 

j'ai recodé, mes plugins implémentent tous la même interface qui a plus de possibilités maintenant (notamment elle peut "greffer" un menu propre au plugin directement dans le menu de la fenêtre principale)
J'ai pas encore testé dans une DLL séparée, c'est la prochaine étape. Pour l'instant il se base sur l'assembly de l'application. Je suppose que pour la DLL j'dois charger l'assembly de la DLL pour trouver ma classe.
 
Y'a un truc qui va être drôle à gérer : le fait de pouvoir ouvrir plusieurs instances d'un même plugin ou d'un même morceau de plugin :p


---------------
In Girum Imus Nocte Et Consumimur Igni
In-Wonderland - Blog - Start64
n°56759
sebx
boulet cherche canon
Posté le 21-03-2007 à 22:46:29  profilanswer
 

les classes statiques / singletons, tu connais pas ?  :p


---------------
Célibataire & béhémiste de service
Gentil Organisateur des rencontres matbe
JH 27 ans, bon salaire, propriétaire, roulant en berline Allemande cherche femme pour mariage, bébés et + si affinités
n°56765
LostSoul
Manieur de hache
Posté le 22-03-2007 à 07:01:44  profilanswer
 

moi oui ...
mais t'oublies que j'suis pas le seul à programmer ce truc :o
suffit de foutre un stack statique dans la classe du plugin qui va mémoriser chaque instance de morceau de plugin
faut que j'fasse une astuce aussi (dans le cas d'un plugin à une seule ouverture autorisée) qui intercepte l'évènemetn closing de la fenêtre (paske onclose implique un dispose) et que ca fasse un hide() à la place.


---------------
In Girum Imus Nocte Et Consumimur Igni
In-Wonderland - Blog - Start64

Aller à :
Ajouter une réponse