ADODB.Connection non eredita da System.Object?!

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?

Print | posted on lunedì 18 ottobre 2004 14:48

Comments have been closed on this topic.