Partilhar via


Conversão de membro importado

Este tópico descreve como o processo de importação converte os seguintes membros:

  • Métodos

  • Propriedades

  • Eventos

Tlbimp. exe se aplica a DefaultMemberAttribute a qualquer método ou propriedade com um DispID de 0. Observe que os desenvolvedores de C# devem tratar esses membros como matrizes. Para obter informações adicionais, consulte a documentação da linguagem de programação.

Métodos

Quando a interoperabilidade COM importa um tipo COM, ele produz um.Assinatura de método do NET Framework equivalente à assinatura do método COM original. Durante o processo de conversão, ele mapeia os parâmetros COM valores de retorno e HRESULTs em um.Assinatura de método do NET Framework, conforme mostrado na ilustração a seguir.

Conversão de assinatura de método

Conversão de assinatura de método

Você pode examinar a sintaxe do método com um visualizador de objeto ou por meio de reflexão, assim como com qualquer outro.NET classe. Por padrão, quando o objeto COM retorna uma falha HRESULT, o tempo de execução lança uma exceção correspondente.

Propriedades

Um desenvolvedor COM pode declarar propriedades e métodos em interfaces. Todas as propriedades têm métodos correspondentes do acessador para definir ou obter os valores de propriedade. Quando o processo de importação converte uma descrição da biblioteca de tipo de uma interface com propriedades de metadados, ele cria uma propriedade e um ou mais métodos do acessador para essa propriedade.

O processo de conversão da biblioteca de tipo transforma os métodos do acessador de propriedade das seguintes maneiras:

  • Propriedades com o [propget] atributo se tornam propriedades gerenciadas do mesmo tipo, com um método correspondente chamado get_propertyname.

  • Propriedades com um a [propput] atributo ou [propputref] atributo se tornam propriedades gerenciadas do mesmo tipo, com um método correspondente chamado set_propertyname.

  • Propriedades com ambos os [propput] e [propputref] atributos tornam-se:

    • Gerenciado de propriedades do mesmo tipo que o [propputref] atributo, com um método correspondente chamado set_propertyname

    • Outro método de assessor com o mesmo tipo que o [propput] atributo, com o nome let_propertyname.

A biblioteca de tipos a seguir mostra as propriedades originais.

Representação de biblioteca de tipo

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

As propriedades de convertido aparecem nas seguintes Visual Basic 2005 fragmento de código.

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)

Eventos

Uma biblioteca de tipos COM pode definir as interfaces usadas para eventos. Dentro da biblioteca, um coclass que origina os eventos pode identificar a interface de evento, especificando a [origem] atributo. O coletor de eventos implementa a interface e uma fonte de evento consome a ele. As interfaces de ponto de conexão COM, que não são descritas na biblioteca de tipos, conectar-se o coletor de eventos para a origem do evento.

No seguinte exemplo de código IDL, o Button classe implementa o IButton interface e origina os eventos a IButtonEvents interface.

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

A.Modelo de evento NET difere consideravelmente o modelo de ponto de conexão COM. Gerenciado classes que os eventos de coletor fazê-lo passando um delegado para a origem do evento, em vez de usar COM pontos de conexão. O serviço de interoperabilidade COM une esses dois modelos de eventos diferentes.

Durante a importação, Tlbimp. exe cria vários tipos que permitem que um aplicativo gerenciado a eventos de coletor que são originados por classes não gerenciados usando o.Modelo de evento NET. Na seqüência de etapas a seguir, o Tlbimp. exe gera classes e interfaces para o Button classe mostrada no exemplo anterior.

  1. O processo de importação cria um tipo delegate para cada evento na interface do evento. Os nomes de delegado consistem na interface do coletor de eventos, um sublinhado, o nome do evento e a palavra EventHandler. Por exemplo, na biblioteca de tipos do exemplo anterior, o Click evento se torna IButtonEvents_ClickEventHandler delegate.

    ' 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();
    

    Observe que a assinatura do delegado é uma tradução direta da assinatura do método não-gerenciado.

  2. Tlbimp. exe importa a interface padrão da forma usual, mantendo o nome da interface da mesma. Neste exemplo, a interface é chamada de 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();
    }
    
  3. Tlbimp. exe importa a interface de eventos da forma usual, mantendo o nome da interface da mesma. Neste exemplo, a interface é chamada de 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();
    }
    
  4. Tlbimp. exe também cria uma segunda interface de evento, designada por "_Event" sufixo adicionado ao nome da interface original. Essa interface de evento a segunda possui Click e Resize eventos como membros. Ele também tem add e remove métodos para delegados de evento. Neste exemplo, a interface é chamada de 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 );
    }
    

    Observação

    No caso raro em que você precisa converter para a interface de eventos, que você converter para a interface produzida pelo Tlbimp. exe em vez da interface original.Por exemplo, você deve converter para IButtonEvents_Event, e não IButtonEvents.

  5. Tlbimp. exe importa o coclass que origina os eventos para garantir a inclusão de todas as interfaces implementadas explicitamente e anexa o nome da classe original com a classe. Por exemplo, o Button coclass torna-se ButtonClass. Tlbimp. exe também produz uma interface coclass com o mesmo nome coclass, que implementa a interface de eventos com o sufixo _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(){}
    }
    

Consulte também

Conceitos

Conversão da biblioteca importados

Conversão de módulo importados

Conversão de tipo importado

Conversão do parâmetro importados

Outros recursos

Biblioteca de tipos ao resumo de conversão de Assembly