Questo articolo è stato tradotto automaticamente. Per visualizzare l'articolo in inglese, selezionare la casella di controllo Inglese. È possibile anche visualizzare il testo inglese in una finestra popup posizionando il puntatore del mouse sopra il testo.
Traduzione
Inglese

Conversione dei membri importati

In questo argomento viene descritto in che modo il processo di importazione converte i seguenti membri:

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

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.

k639e386.collapse_all(it-it,VS.110).gifRappresentazione di libreria dei tipi

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 IntegerEnd 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.

  1. 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 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.

  2. 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 {
        void Init();
    }
    
  3. 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 {
        void Click(int x, int y);
        int Resize();
    }
    
  4. 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.

    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 );
    }
    
    NotaNota

    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.

  5. 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:IButton, IButtonEvents_Event {} 
    
    public class ButtonClass:Button,IButton,IButtonEvents_Event 
    {
    void Init(){}
    }
    
Mostra: