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
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.
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.
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(); }
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(); }
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.
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 do parâmetro importados