Conversione dei membri importati
In questo argomento viene descritto in che modo il processo di importazione converte i seguenti membri:
Metodi
Proprietà
Eventi
Mediante Tlbimp.exe l'oggetto DefaultMemberAttribute viene applicato a qualsiasi membro o proprietà con DispID uguale a 0. I membri devono essere gestiti dagli sviluppatori C# come matrici. Per ulteriori informazioni, vedere la documentazione del proprio linguaggio di programmazione.
Quando l'interoperabilità COM importa un tipo COM, produce per il metodo .NET Framework una firma equivalente a quella del metodo COM originale. Durante il processo di conversione, i parametri COM, i valori restituiti e gli HRESULT vengono fatti corrispondere a quelli della firma di un metodo .NET Framework, come illustrato nella figura che segue.
Conversione delle firme dei metodi
La sintassi del metodo potrà essere esaminata con un visualizzatore oggetti o tramite reflection, allo stesso modo di qualsiasi altra classe .NET. In base all'impostazione predefinita, quando l'oggetto COM restituisce un HRESULT di errore, il runtime genererà una corrispondente eccezione.
Uno sviluppatore COM può dichiarare proprietà e metodi sulle interfacce. Tutte le proprietà dispongono di metodi di accesso per l'impostazione o il recupero dei valori della proprietà. Quando il processo di importazione converte in metadati la descrizione che una libreria dei tipi presenta di un'interfaccia con proprietà, creerà una proprietà e uno o più metodi di accesso corrispondenti.
Il processo di conversione della libreria dei tipi trasforma i metodi di accesso della proprietà nel modo seguente:
Le proprietà con l'attributo [propget] divengono proprietà gestite dello stesso tipo, con un metodo corrispondente denominato get_propertyname.
Le proprietà con l'attributo [propput] o [propputref] divengono proprietà gestite dello stesso tipo, con un metodo corrispondente denominato set_propertyname.
Le proprietà che presentano sia l'attributo [propput] che l'attributo [propputref] divengono:
Proprietà gestite dello stesso tipo dell'attributo [propputref], con un metodo corrispondente denominato set_propertyname
Un diverso metodo di accesso con lo stesso tipo dell'attributo [propput], denominato let_propertyname.
Nella libreria dei tipi riportata di seguito vengono mostrate le proprietà originali.
interface ISample : IDispatch {
[propget] HRESULT prop1([out, retval] short *pVal);
[propput] HRESULT prop1([in] short newVal);
[propget] HRESULT prop2([out, retval] INew **pVal);
[propputref] HRESULT prop2([in] INew *newVal);
[propget] HRESULT prop3([out, retval] INew **ppINew);
[propput] HRESULT prop3([in] BSTR text);
[propputref] HRESULT prop3([in] INew *pINew);
}
Le proprietà convertite vengono visualizzate nel frammento di codice Visual Basic 2005 riportato di seguito.
Public Property
Get Prop1() As Integer … End Get
Set Prop1(val as Integer) … End Set
End Property
Public Property
Get Prop2() As INew … End Get
Set Prop2(val as INew) … End Set
End Property
Public Property
Get Prop3() As INew … End Get
Set Prop3(val as INew) … End Set
End Property
Public let_prop3(String as Text)
Una libreria dei tipi COM può definire interfacce utilizzate per gli eventi. All'interno della libreria, una coclasse che origina eventi può identificare l'interfaccia eventi specificando l'attributo [source]. Un sink di evento implementa l'interfaccia e un'origine evento la utilizza. Le interfacce dei punti di connessione COM, che non sono descritte nella libreria dei tipi, collegano il sink di evento all'origine evento.
Nell'esempio di codice IDL riportato di seguito la classe Button implementa l'interfaccia IButton e origina gli eventi sull'interfaccia IButtonEvents.
interface IButton {
HRESULT Init();
}
interface IButtonEvents {
HRESULT Click([in] int x, [in] int y);
HRESULT Resize([out, retval] int *pRetval};
}
coclass Button {
[default] interface IButton;
[default, source] interface IButtonEvents;
}
Il modello eventi di .NET differisce considerevolmente dal modello basato sui punti di connessione di COM. Le classi gestite che presiedono al sink degli eventi adempiono al proprio scopo passando un delegato all'origine evento, anziché utilizzando i punti di connessione COM. Il servizio di interoperabilità COM permette l'interazione tra questi due diversi modelli eventi.
Durante l'importazione, Tlbimp.exe crea diversi tipi che consentono alle applicazioni gestite di effettuare il sink di eventi originati da classi non gestite utilizzando il modello eventi di .NET. Nella procedura illustrata di seguito, Tlbimp.exe consente di generare classi e interfacce per la classe Button mostrata nel precedente esempio.
Il processo di importazione crea un tipo delegato per ciascun evento dell'interfaccia eventi. I nomi dei delegati sono costituiti dal nome dell'interfaccia del sink di evento, da un carattere di sottolineatura, dal nome dell'evento e dalla parola EventHandler. L'evento Click della libreria dei tipi illustrata nell'esempio precedente, diventa ad esempio il delegato IButtonEvents_ClickEventHandler.
' A delegate for each event. Delegate Sub IButtonEvents_ClickEventHandler(ByVal x As Integer, _ ByVal y As Integer) Delegate Function IButtonEvents_ResizeEventHandler() As Integer
// A delegate for each event. delegate void IButtonEvents_ClickEventHandler(int x, int y); delegate int IButtonEvents_ResizeEventHandler();
Si noti che la firma del delegato è direttamente derivata dalla firma del metodo non gestito.
Tlbimp.exe importa l'interfaccia predefinita come di consueto, conservandone il nome. In questo esempio l'interfaccia è denominata IButton.
' Direct import of original default interface. Public Interface IButton Sub Init() End Interface
// Direct import of original default interface. public interface IButton { void Init(); }
Tlbimp.exe importa l'interfaccia eventi come di consueto, conservandone il nome. In questo esempio l'interfaccia è denominata IButtonEvent.
' Direct import of original event interface. ' Not of interest to managed sinks. Public Interface IButtonEvents Sub Click(ByVal x As Integer, ByVal y As Integer) Function Resize() As Integer End Interface
// Direct import of original event interface. // Not of interest to managed sinks. public interface IButtonEvents { void Click(int x, int y); int Resize(); }
Mediante Tlbimp.exe viene inoltre creata una seconda interfaccia eventi, caratterizzata dal suffisso "_Event" aggiunto al nome dell'interfaccia originale. Questa seconda interfaccia ha eventi Click e Resize come membri e dispone di metodi add e remove per i delegati di evento. In questo esempio l'interfaccia è denominata IButtonEvents_Event.
' Modified version of the event interface with events ' for managed sinks.
Public Interface IButtonEvents_Event Sub Click As IButtonEvents_Click Function Resize() As IButtonEvents_Resize Sub add_Click(ByVal Click As IButtonEvents_ClickEventHandler) Sub remove_Click(ByVal Click As _ IButtonEvents_ClickEventHandler) Sub add_Resize(ByVal Resize As _ IButtonEvents_ResizeEventHandler) Sub remove_Resize(ByVal Resize As _ IButtonEvents_ResizeEventHandler) End Interface // Modified version of the event interface with events // for managed sinks. public interface IButtonEvents_Event { IButtonEvents_Click Click; IButtonEvents_Resize Resize; void add_Click(IButtonEvents_ClickEventHandler ); void remove_Click(IButtonEvents_ClickEventHandler ); void add_Resize(IButtonEvents_ResizeEventHandler ); void remove_Resize(IButtonEvents_ResizeEventHandler ); }
Nota Nei rari casi in cui risulta necessario eseguire il cast all'interfaccia eventi, il cast verrà eseguito all'interfaccia prodotta da Tlbimp.exe, anziché all'interfaccia originale.Occorre ad esempio eseguire in cast in IButtonEvents_Event, non in IButtonEvents.
Mediante Tlbimp.exe viene importata la coclasse che origina gli eventi per garantire l'inclusione di tutte le interfacce implementate in modo esplicito. Al nome della classe originale viene aggiunto il suffisso "Class". La coclasse Button diviene ad esempio ButtonClass. Viene inoltre creata un'interfaccia della coclasse con lo stesso nome della coclasse, con cui viene implementata l'interfaccia eventi con il suffisso _Event.
' This is the imported coclass interface. ' Note the underscore in IButtonEvents_Event. Public Interface Button Inherits IButton Inherits IButtonEvents_Event End Interface Public Class ButtonClass Implements Button Implements IButton Implements IButtonEvents_Event Sub Init() End Sub 'Init End Class
// This is the imported coclass interface. // Note the underscore in IButtonEvents_Event. public interface Button:IButton, IButtonEvents_Event {} public class ButtonClass:Button,IButton,IButtonEvents_Event { void Init(){} }
Conversione delle librerie importate
Conversione dei moduli importati
Conversione dei tipi importati
Conversione dei parametri importati
Riepilogo della conversione da libreria dei tipi ad assembly