Newsgroup: it.comp.lang.visual-basic
Titolo: FW4.0 VS2010 Reflection Plugin Interfacce ...poi non rompo più....spero!

Non capisco dove sbaglio
Voglio implementare un plugin per accedere a SQLite
L'ho già fatto simile in un altro progetto con Access ma qui sbaglio 
qualcosa! E mi arrovello su me stesso!
Mi sono fatto un mini schema in una interfaccia
Public Interface InterfaceAPI_db
    'FILE INTERFACCIA
    'tipo
    Structure info
        Dim NomePlugin As String
        Dim Versione As String
        Dim Autore As String
        Dim Descrizione As String
    End Structure
    'funzioni *****START
    Function ConnessioneDB(Optional ByVal StringaConnessione As String 
= "") As System.Data.Common.DbConnection
    Function EseguiSQL(ByVal QuerySQL As String, ByVal Connessione As 
System.Data.Common.DbConnection) As Boolean
    Function CaricaDataTable(ByVal NomeTabella As String, ByVal 
QuerySQL As String) As System.Data.DataTable
    Function CreaDataAdapter(ByVal QuerySQL As String, Optional ByVal 
StringaConnessione As String = "") As System.Data.Common.DataAdapter
    'funzioni *****END
    'proprietà *****START
    ReadOnly Property ErroreDB() As Dictionary(Of String, Object)
    'stringa di connessione
    Property StringaConnessione(ByVal valore As String) As String
    ReadOnly Property ErroreIntervenuto As Boolean
    ReadOnly Property InfoPlugin As info
    'proprietà *****END
End Interface
....nulla di trascendentale...ripeto sta roba con MySQL ed Access va
Cosa ho cambiato?
Non ho fatto un progetto a parte e referenziato la dll nel plugin e nel 
gestore....ho proprio linkato il file di interfaccia!
Il plugin è una cosa del tipo
Imports System.Data
Imports System.Data.SQLite
Imports System.Data.Common
Imports System.IO
Public Class SqlitePlugin
    Implements InterfaceAPI_db
...
    Public Function CaricaDataTable(ByVal NomeTabella As String, ByVal 
QuerySQL As String) As System.Data.DataTable Implements 
InterfaceAPI_db.CaricaDataTable
       ..
    End Function
    Public Function ConnessioneDB(Optional ByVal StringaConnessione As 
String = "") As System.Data.Common.DbConnection Implements 
InterfaceAPI_db.ConnessioneDB
        ..    End Function
    Public Function CreaDataAdapter(ByVal QuerySQL As String, Optional 
ByVal StringaConnessione As String = "") As 
System.Data.Common.DataAdapter Implements 
InterfaceAPI_db.CreaDataAdapter
        ..
    End Function
    Public Function EseguiSQL(ByVal QuerySQL As String, ByVal 
Connessione As System.Data.Common.DbConnection) As Boolean Implements 
InterfaceAPI_db.EseguiSQL
        ..
    End Function
#Region "Proprietà implementazione"
    'Proprietà implementazione
    Public Property StringaConnessione(ByVal valore As String) As 
String Implements InterfaceAPI_db.StringaConnessione
        ..
    End Property
    'Aggiunta specifica per sqlite: non mi è riuscito passarla nella 
stringa!
    Public WriteOnly Property SqlitePwDb As String
        ..
    End Property
    Public ReadOnly Property ErroreIntervenuto As Boolean Implements 
InterfaceAPI_db.ErroreIntervenuto
        ..
    End Property
    Public ReadOnly Property InfoPlugin As InterfaceAPI_db.info 
Implements InterfaceAPI_db.InfoPlugin
..
    End Property
#End Region
    '********************** COSTRUTTORE start *********************
    Sub New()
..
    End Sub
    Sub New(ByVal pathDatabase As String, Optional ByVal 
passwordDatabase As String = "")
...
    End Sub
    '********************** COSTRUTTORE end *********************
    Public ReadOnly Property ErroreDB As 
System.Collections.Generic.Dictionary(Of String, Object) Implements 
InterfaceAPI_db.ErroreDB
        Get
            Return retErr
        End Get
    End Property
End Class
Quindi cosa ho fatto di diverso dal solito....ho implementato anche 
ALTRI metodi e proprietà nel plugin...ma l'interfaccia è implementata 
correttamente...infatti compila e và!
Il problema nel gestore!
quindi in un altro progetto con il solito file di interfaccia nei file 
del progetto
.....
 Private Function ScandisciDir() As Boolean
        'cerca i files che possono contenere un plugin!
        Dim asmPlugIn As Assembly
        Dim bingo As Boolean = False
        For Each fl As String In Directory.GetFiles(_pathPlugin, 
"*.dll")
            asmPlugIn = Assembly.LoadFrom(fl)
            'cerco se c'è la mia interfaccia...e già che ci sono la 
classe per il costruttore!
            Dim Classe As Type = Nothing
            For Each tipo As Type In asmPlugIn.GetExportedTypes
                If tipo.IsInterface AndAlso tipo.Name = 
"InterfaceAPI_db" Then
                    bingo = True
                End If
                If tipo.IsClass AndAlso tipo.GetConstructors.Length > 0 
Then
                    'Bingo è lei!....con l'avvertenza che nel plugin
                    'C'E' SOLTANTO UNA CLASSE CON RELATIVO COSTRUTTORE
                    Classe = tipo
                End If
            Next
            'MONTIAMO IL TUTTO
            If bingo AndAlso (Not IsNothing(Classe)) Then
                Dim cazzo As Object = Activator.CreateInstance(Classe)
                'cast
                Dim CazzoCube As InterfaceAPI_db = cazzo
                stop
            End If
.....
il problema mi salta fuori qui
La classe viene correttamente creata...esploro la var object e il 
plugin è stato creato con tutte le istanze di variabile e metodi e 
proprietà correttamente imputati!
è il cazzoCube che non va!
Impossibile eseguire il cast di oggetti di tipo 
'pluginSqlite.SqlitePlugin' sul tipo 'GraficaGia2011.InterfaceAPI_db'.
Ovviamente provato con esplicitamente directcast e ctype sempre il cast 
sbagliato!
Ho provato a fare l'activator sull'interfaccia (vabbe le provo tutte 
anche se so che sono sbagliate) e mi dice che non c'è il costruttore 
(ovvio l'interfaccia non ce l'ha!)
e altrettanto ovviamente il progetto di test (casomai mi fossi bacato 
il cervello )
                For Each tipo In pippo
                    If tipo.Name = "TestPlugin" Then
                        Stop
                        Dim a As Object = 
Activator.CreateInstance(tipo)
                        Stop
                        Dim p As IPlugin = a
                        Stop
                    End If
...funziona!(però è un test con stringhe e non con oggetti sqlite)
Ovviamente non so più che pesci prendere!
Santo Riflesso da Pinerolo aiutami tu!
-- 
----- Italliaaaaa 3227! -----
Ho visto cose che voi umani non potreste immaginare... navi da 
combattimento in fiamme al largo dei bastioni di Orione. E ho visto i 
raggi B balenare nel buio vicino alle porte di Tannhauser. E tutti quei 
momenti andranno perduti nel tempo come lacrime nella pioggia. È tempo 
di morire...
Unità NEXUS6 Roy Batty N6MAA10816 Ment.LEV A

 Non capisco dove sbaglio
aggiungo che preso dalla voglia di capire
ho aggiunto il file del plugin al progetto del gestore e che
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As 
System.EventArgs) Handles Button2.Click
        Dim pp As New SqlitePlugin
        Dim Interf As InterfaceAPI_db
        Interf = pp
        Stop
    End Sub
Funziona benissimo! Quindi sta proprio in un mio errore con la 
reflection l'ambarandan!....non ci sono scuse purtroppo!
...
-- 
----- Italliaaaaa 3227! -----
Grembiule nero e fiocco azzurro: per un bambino milanista il primo 
giorno di scuola è un trauma.
(Diego Abatantuono)

Wodka40° ci ha detto :
Trovato l'ambarandan mi autorispondo...ma non so se dico completamente 
il vero!
E' un problema dei mille rivoli e rivoletti che si generano in fase di 
compilazione!
Cosa c'era prima(essenzialmente)
2 progetti..
un gestore di plugin
Il plugin
...dove era l'interfaccia comune? in un file che era linkato fra i 2 
progetti!
NON ANDAVA!
Cosa c'è adesso
3 progetti
un gestore di plugin
Il plugin
Il "contratto" (Mauro non me ne volere l'ho chiamato dbAPI)
dov'è l'interfaccia comune? nella DLL dei contratti!
I 2 progetti (manager e plugin) se la tengono nei riferimenti
ADESSO FUNZIONA
                Dim cazzo As Object = Activator.CreateInstance(Classe)
                'cast
                Dim CazzoCube As dbAPI.InterfaceAPI_db
                CazzoCube = cazzo
                MsgBox(CazzoCube.InfoPlugin.Descrizione)
Fanculo!
Evidentemente per il compilatore aver linkato il file non faceva le due 
interfacce uguali o chissàcosa! :-[
Probabilmente li marchiava oggetti diversi che ne sò....non sono un 
guru.....comunque adesso funziona!
Non so perchè ma funziona...e la cosa mi spaventa!
eh eh eh :D
-- 
----- Italliaaaaa 3227! -----
Là dove l'uomo scopre un minimo di ordine, immediatamente ne suppone 
troppo.
(Francesco Bacone)

 Wodka40° ci ha detto :
rifanculo c'ho perso una giornata e mezzo!!!
-- 
----- Italliaaaaa 3227! -----
Ti prego, ti prego, non ci uccidere. Ti prego baby, lo sai che ti amo. 
Non avrei mai voluto lasciarti, non è stata colpa mia. Davvero, sono 
sincero. Quel giorno finì la benzina. Si bucò un pneumatico. Non avevo 
i soldi per il taxi! Il mio smoking non era arrivato in tempo dalla 
tintoria! Era venuto a trovarmi da lontano un amico che non vedevo da 
anni! Qualcuno mi rubò la macchina! Ci fu un terremoto! Una tremenda 
inondazione! Un'invasione di cavallette!
John Belushi [da "Blues Brothers"]

 Non so perchè ma funziona...e la cosa mi spaventa!
è normale che con i file linkati non funzioni :-)
un tipo per .net è definito dal full-type-name che è il nome della 
classe + il namespace + l'assembly che lo contiene, ergo quando linki i 
file in due assembly diversi crei formalmente due tipi diversi.
.m
-- 
è corta