Newsgroup: it.comp.lang.visual-basic
Titolo: Guru della Reflection...aiuto!!! Contesto di Ispezione

A me questo Net sta antipatico: credo di aver capito una cosa...apro
la porta ...e mi trovo praterie immense da esplorare!...non si finisce
mai!
Allora lo scenario:
Core application su dir "miaApp"
Plugin dentro "miaApp/Plugin"
Interfaccia
    Public Interface ITipoPlugin
        ReadOnly Property NomePlugin As String
        ReadOnly Property Supporta As Integer
        ReadOnly Property Versione As String
        Function runPlugin(ByVal ParamArray SetStartup()) As Integer
    End Interface
Problema:
Nella dir "miaApp/Plugin"
NON CI SONO solo plugin utili ma anche altri opzionali
Devo quindi decidere quale caricare e quale no!
Bon mi sono detto carico tutti file dll e cerco l'interfaccia
ITipoPlugin...se c'è è un plugin che mi serve e al limite lo istanzio
e mi faccio dare la versione!
            Try
                For Each pathAssembly As String In files
                    Ispeziona =
Assembly.ReflectionOnlyLoadFrom(pathAssembly)
                    For Each tipo As Type In Ispeziona.GetTypes()
                        Debug.WriteLine(tipo.Name)
                    Next
                Next
            Catch ex As Exception
            End Try
PRRRRRRRRRRRRRRRRR mi ride in faccia!
 Ispeziona = Assembly.LoadFrom(pathAssembly)
tutto a posto! E te credo carica in memoria!
Ma scusa il contesto di ispezione non serve proprio a vedere PRIMA di
caricare un assembly se ha le info che ti servono? E queste info NON
contemplano i tipi pubblici che esporrà?(evidentemente no!)
Che mi devo fare un tag nel manifest dei metadati dell'assembly e
leggere quello come workaround?(ma funzionerà?)
E a far così se l'assembly se non mi serve me lo devo scaricare...che
palle...fare e disfare per nulla eh! Casomai la GAC il GC o quel che
stracazzo è non me lo scarica nemmeno subito dalla ram!
SIGH....che ignoranza abissale che ho!
Son demoralizzato...vado a farmi una dose di caffeina!
Saluti!

 PRRRRRRRRRRRRRRRRR mi ride in faccia!
che eccezione ottieni?
.m
-- 
Mauro Servienti
{C67C0157-5D98-4733-A75E-93CAEE4BADC8}
Microsoft MVP - Visual C# / MCTS
http://mvp.support.microsoft.com
blog @ 
http://milestone.topics.it
whynot [ at ] topics [ dot ] it

 che eccezione ottieni?
ReflectionTypeLoadExcept
{"Impossibile caricare uno o più tipi richiesti. Per ulteriori
informazioni, recuperare la proprietà LoaderExceptions."}
ovviamente in
For Each tipo As Type In Ispeziona.GetTypes()
al punto getTypes
non sono un guru ma forse è che il contesto di ispezione carica SOLO i
metadati dell'assembly e quindi non è altro che un altro modo di
accedere all'xml del manifest???
E che i tipi invece se li rende disponibili solo piazzando in memoria
nell'app domain corrente?....

Ciao Wodka40[Google],

no, l'inghippo è che ReflectionOnlyLoadFrom non carica le dipendenze 
quindi se nel ravanare i tipi viene incontrato un tipo definito in un 
altro assembly ti becchi l'exception.


On 11 Feb, 11:39, Mauro Servienti [MVP] <mauroservie...@online.nospam>
wrote:
Mi sembra che più sega di così un plugin non possa essere!
Imports System
Imports System.Reflection
Namespace AccessPlugin
    Public Interface ITipoPlugin
        ReadOnly Property NomePlugin As String
        ReadOnly Property Supporta As Integer
        ReadOnly Property Versione As String
        Function runPlugin(ByVal ParamArray SetStartup()) As Integer
    End Interface
    Friend Enum TipoStorage
        'database
        Access = 0
        MySQL = 1
        Sqlite = 2
        SQLserver = 3
        SQLserverCompact = 4
        PostgreSQL = 5
        'File
        FileTesto = 100
        FileCSV = 101
        FileXML = 102
        'Altro
        Email = 200
        'Custom
        Custom = 250
    End Enum
    Public Class AccessPlugin
        Implements ITipoPlugin
        Public ReadOnly Property NomePlugin As String Implements
ITipoPlugin.NomePlugin
            Get
                Return "Test Access plugin © by Marco"
            End Get
        End Property
        Public Function runPlugin(ByVal ParamArray SetStartup() As
Object) As Integer Implements ITipoPlugin.runPlugin
            Return 1
        End Function
        Public ReadOnly Property Supporta As Integer Implements
ITipoPlugin.Supporta
            Get
                Return TipoStorage.Access
            End Get
        End Property
        Public ReadOnly Property Versione As String Implements
ITipoPlugin.Versione
            Get
                Return "0.0.1"
            End Get
        End Property
    End Class
End Namespace
Il plugin l'ho compilato e pure firmato....
con il load funziona....sigh!...
Mi manca qualche decorazione di attributi?

 wrote:
Trovato!....nei meandri dell'eccezione!
{"Impossibile risolvere la dipendenza dall'assembly
'Microsoft.VisualBasic, Version=10.0.0.0, Culture=neutral,
PublicKeyToken=b03f5f7f11d50a3a' perché non è stata precaricata.
Quando si utilizzano API ReflectionOnly, gli assembly dipendenti
devono essere precaricati o caricati su richiesta attraverso l'evento
ReflectionOnlyAssemblyResolve.":Nothing}
Ora devo trovare la soluzione

         Function runPlugin(ByVal ParamArray SetStartup()) As Integer
SetStartup che cosa ï¿œ?




Che capisco sia quella di caricare....non si scappa...va buttata via
memoria!

 whynot [ at ] topics [ dot ] it
Non fa nulla.....per ora....poi gli passerò quello che serve per
inizializzare i plugin

 A me questo Net sta antipatico: credo di aver capito una cosa...apro
è una strada persa in partenza
gente che ha suppergiù il medesimo problema
In Customizing the .NET Framework Common Language Runtime , it is
explained that Load and LoadFrom create separate "scopes" for loaded
assemblies, which I guess explains the problem. Something to try is to
find the assemblies yourself and load them all with LoadFrom.
fonte:
http://stackoverflow.com/questions/2324327/cannot-reflect-over-
assembly-that-shares-a-dependency-of-different-version


wrote:
RISOLTO!
Son passato da un altra strada....a che servono le guide allora???
Forse non sono aggiornate? boh!
FW 4.0
VS2010
 Dim cc() As Type
            For Each pathAssembly As String In files
                Ispeziona =
Assembly.ReflectionOnlyLoadFrom(pathAssembly)
                cc = Ispeziona.GetExportedTypes
                For Each Tipo As Type In cc
                    If Tipo.Name = "ITipoPlugin" Then
                        MsgBox("Fanculo trovato!")
                    End If
                Next
            Next
....e appare..."Fanculo Trovato!"
...uao ....ora va meglio! Sò una cosa in più!
Piccoli guru crescono!

 Piccoli guru crescono!
Va che questa cosa potrebbe essere utile a breve, visto che stiamo
reimplementando il nostro programma (scritto in VB6) su WPF, e devo
utilizzare proprio dei plugin caricati a runtime.
Nicola

 utilizzare proprio dei plugin caricati a runtime.
MEF tutta la vita.
.m
-- 
Mauro Servienti
{C67C0157-5D98-4733-A75E-93CAEE4BADC8}
Microsoft MVP - Visual C# / MCTS
http://mvp.support.microsoft.com
blog @ 
http://milestone.topics.it



Preferisco la SACHER!
"....caz è mef???"


wrote:

Visto che è!
Beh la riflessione diventa molto più ampia del topic a questo punto.
Sono convinto che nessuno inventa nulla e che probabilmente c'è già
una collezione , una libreria, uno snippet, un framework...quel che
è...su questo grande pianeta che risolve il mio problema di: aprire
una connessione, aggiornare un componente, visualizzare una misura etc
etc.
Solo che purtroppo non posso stare 8/12 ore al giorno a imparare come
altri hanno affrontato il problema (e sicuramente sarà affrontato
anche meglio...se non altro per le ore/lavoro che ci hanno speso!).
Ognuno ha le sue dimensioni...le mie sono piccolissime.
Se perdo 20 ore a capire come funziona questo "coso"  sono 20 ore che
mancano alla mia attività.
Inoltre se non capisco come gira tutto...mi affido ad una scatola nera
di altri e non so che spippolo...faccio come i lamer che disprezzo!
Son convinto che usare sto MEF è roba per chi sà benissimo come
funziona la reflection, padroneggia i pattern e sà che usando sto coso
acquista qualcosa in più.
Io metterò in piedi le mie grezzissime esperienze nel mio grezzissimo
codice e spero un domani di arrivare alle finezze che usa con successo
Mauro ...al mio livello mettere troppa carne al fuoco significa non
mangiare mai e morire di fame!

Ciao Wodka40[Google],

condivido su tutta la linea, in effetti il mio approccio è sempre stato 
prima me lo faccio io con esattamente e solo quello che mi serve, a 
questo punto padroneggio l'argomento/problema e so anche cavarmela con 
qualcosa fatto da altri.
nel caso specifico dei plugin MEF rende il tutto un vero giochetto 
banalissimo.
