Estrazione controlli da form tramite Reflection

venerdì 26 luglio 2013 - 14.26

PhoenixNET Profilo | Junior Member

Sto tentando di estrarre i controlli di una form partendo da una DLL, fino all'estrazione delle form nessun problema, quando tento di estrarre i controlli dalla form appena trovata la lista dei controlli è sempre vuota.
Questo è il codice che sto utilizzando:

Dim dllAssembly As System.Reflection.Assembly = System.Reflection.Assembly.LoadFrom(strFile)
'Dim dllAssembly As System.Reflection.Assembly = System.Reflection.Assembly.LoadFile(strFile)

Dim lista = GetTypes(dllAssembly)

For Each r As Type In lista
If IsNothing(r) Then Continue For

If r.IsSubclassOf(GetType(Form)) Then

ramo = New TreeNode(r.Name)
ramo.Tag = r
radice.Nodes.Add(ramo)

Dim bf As BindingFlags = (BindingFlags.Public & _
BindingFlags.NonPublic & _
BindingFlags.Static & _
BindingFlags.Instance & _
BindingFlags.DeclaredOnly)
'BindingFlags.Public & BindingFlags.NonPublic & BindingFlags.Instance & BindingFlags.GetField)

Dim listaControlli() As FieldInfo = Nothing
listaControlli = r.GetFields(bf)

For Each obj As FieldInfo In listaControlli
If obj.FieldType.IsSubclassOf(GetType(Control)) Then
...............
End If
Next

Beep()
End If

Next

Grazie a tutti
PhoenixNET

Vinsent Profilo | Senior Member

Sto approfondendo da poco il discorso Reflection...e ho preso spunto dal tuo problema per vedere se "ce la posso fare"....e ce l' ho fatta...però ho usato quel che so e non so dirti sul tuo codice.
In pratica creo un' istanza della Form e ne ricavo i Controlli, se ti interessa do una "pulita" e posto un' esempio.
Ciao

PhoenixNET Profilo | Junior Member

se riesci a postare qualcosa te ne sarei grato.

Grazie

Ciao

PhoenixNET

Vinsent Profilo | Senior Member

Ok, tieni presente che non è il mio "mestiere"....e molto probabilmente non è il metodo giusto.

PhoenixNET Profilo | Junior Member

Il codice che hai postato va bene se l'eseguibile o la dll non ha riferimenti al suo interno perchè se hai dei riferimenti da errore.

Ho fatto qualche verifica, seguendo il tuo consiglio ho provato a istanziare i controlli ma non posso perchè il costruttore delle mie form ha come parametri classi che non fanno nemmeno parte della DLL, per cui devo leggere i Field via reflection senza istanziare nulla.

Qualche aiutino :-)

PhoenixNET

Vinsent Profilo | Senior Member

Quindi, ad esempio, hai DLL1 che contiene il Controllo, DLL2 che contiene la Form che contiene il Controllo della DLL1?
Comunque, con FieldInfo accedi ha ciò che è dichiarato a livello di NameSpace, mentre se dichiari i controlli all' interno di un metodo devi accedere a quest' ultimo. Per quanto riguarda le dipendenze dovrebbero essere risolte in automatico dal FrameWork.
Questo per quanto ho capito leggendo "quà e là"...
Riesci a postare un' esempio su cui "lavorare"?

PhoenixNET Profilo | Junior Member

Riepilogando, la DLL ha delle dipendenze, la form che recupero per essere istanziata devo passagli dei parametri cosi:

dim form as new frmMiaForm(a as classePersonalizzata)

per indenterci qualcosa del genere, per qui quando recupero la form per istanziarla dovrei passagli il parametro classePersonalizziata che non devo recuparare i fiels in questo modo:

lista = elementoAnalizzato.GetFields(bf)

il problema è che non mi restituisce nulla.

il codice lo trovi all'inizio del forum.
PhoenixNET

Vinsent Profilo | Senior Member

Intendevo un' esempio della DLL.
Comunque riguardando meglio il codice del primo post credo di aver capito...il problema è il BindingFlags.
Come lo dichiari tu (bf) cerchi un controllo che abbia "tutti" i BindingFlags e quindi non trovi niente, almeno credo...
Prova a dichiarare i BindingFlags così:
listaControlli = r.GetFields(BindingFlags.Public Or _ BindingFlags.NonPublic Or _ BindingFlags.Instance Or _ BindingFlags.GetField)
in modo che se anche un solo BindingFlags è rispettato ti trova il controllo.
Ho provato con qualche exe e la differenza c' è.
Ciao
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5