Sto scrivendo un piccolo controllo per la generazione di stringhe di connessione generiche ed ho deciso di appoggiarmi all'arcinoto oggetto (COM) Datalink della libreria MSDASC. Costruisco il wrapper e lo provo:
Dim cn As New ADODB.Connection
Dim UDL As New MSDASC.DataLinksClass
UDL.PromptEdit(cn)
Sull’ultima riga viene segnato l’errore:
Option Strict On non consente conversioni implicite da "System.Object" a "ADODB.Connection".
Cioé ADODB.Connection non eredita da Object?
…da quanto ho capito gli unici tipi che non derivano da Object sono le interfacce. Apro l’Object browser e vedo che Connection appare come una classe. Del resto New ADODB.Connection è un’operazione legale.
Apro Reflector e vedo che Connection è marcata come Interfaccia e il corrispondente oggetto è ConnectionClass. Troppo facile , cambio la dichiarazione di cn:
Dim cn As New ADODB.ConnectionClass
...eee...
Option Strict On non consente conversioni implicite da "System.Object" a "ADODB.ConnectionClass".
!!!
...e non ho capito niente...
Eppure reflector dice che ADODB.ConnectionClass deriva da System.Object (nel suo IL c’é anche extends object!)
Qualcosa non mi torna.
Tento una variante:
Dim O As Object = cn
Questo non genera alcun errore di compilazione.
Provo a decompilare la firma del metodo UDL.PromptEdit:
Public Overridable Function PromptEdit(<In, Out, MarshalAs(UnmanagedType.IDispatch)> ByRef ppADOConnection As Object) As Boolean Implements IDataSourceLocator.PromptEdit
MarshalAsAttribute... TlbImp usa MarshalAs come specificato nella documentazione:
ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.1040/cpref/html/frlrfSystemRuntimeInteropServicesMarshalAsAttributeClassTopic.htm
Che sia qui l’inghippo? Dovrebbe forse usare UnManagedType.Inteface o Any? Perché MarshalAs non consente trasformazioni da ConnectionClass a Object?