Conversão de membro exportado
Este tópico descreve como o processo de exportar converte os seguintes membros:
Métodos
Propriedades
Eventos
Métodos
Clientes COM esperam telefonar métodos, passando tipos de dados COM familiares, sistema autônomo parâmetros e recebendo HRESULTs em retorno.No território do .NET no entanto, as classes não possuem nenhuma restrição tal tipos de retorno (e, na verdade, não usam HRESULTs).
Para satisfazer os dois modelos, cada método de um tipo gerenciado possui uma assinatura do .NET e uma assinatura COM implícita.Duas assinaturas são geralmente muito diferentes..NET os clientes interagem com o servidor usando a assinatura de .NET enquanto (possivelmente ao mesmo time) os clientes COM interagem com o servidor usando a assinatura COM.O servidor implementa o método com a assinatura do .NET e o tempo de execução do serviço de marshaling é responsável por fornecer um stub com a assinatura COM que delega a telefonar do método gerenciado.
HRESULT tradução
Uma assinatura gerenciada é convertida em uma assinatura não gerenciada, alterando o valor retornado gerenciado para um [out, retval] retornam valor de parâmetro e a alteração do tipo de não gerenciado para HRESULT.Por exemplo, a DoSomething método pode ter as seguintes assinaturas:
Assinatura gerenciada
short DoSomething(short i);
Assinatura não gerenciada
HRESULT DoSomething([in] short i, [out, retval] short *rv);
Observe que a assinatura COM retorna um HRESULT e tem um parâmetro para o valor retornado out adicionais.O valor retornado do gerenciado implementação sempre retorna sistema autônomo um [out, retval] parâmetro adicionado ao participante do DES gerenciado assinatura, enquanto o DES gerenciado assinatura sempre retorna um HRESULT.Se o método gerenciado tiver um retorno de void, o tempo de execução omite [out, retval] parâmetro.Por exemplo:
Assinatura gerenciada
void DoSomething(short i);
Assinatura não gerenciada
HRESULT DoSomething([in] short i);
Em algumas circunstâncias, é preferível deixar o gerenciado assinatura inalterada.Você pode usar o PreserveSigAttribute para fazer isso.Por exemplo:
Assinatura gerenciada
[PreserveSig] short DoSomething(short i);
Assinatura não gerenciada
short DoSomething ([in] short i);
Ter duas assinaturas de método distintas torna mais fácil usar a classe de clientes COM e .NET diretamente.Além disso, os clientes COM e .NET podem usar uma classe .NET simultaneamente.sistema autônomo o autor da classe, você implementa o gerenciado assinatura apenas.Usando Tlbexp.exe (ou uma API equivalente) automaticamente exporta a assinatura a uma biblioteca de tipos gerada para a classe.
Métodos sobrecarregados
Embora o .NET ofereça suporte aos métodos sobrecarregados, o IDispatch interface depende somente nome de método para vinculação, em vez de assinatura do método completo.Portanto, não é capaz de oferecer suporte a métodos sobrecarregados.No entanto, para fornecer acesso aos métodos sobrecarregados de um tipo, Tlbexp.exe decora os nomes dos métodos sobrecarregados com um número ordinal para que cada nome de método seja exclusivo.
Gerenciado a seguir e assinaturas não gerenciadas mostram a inclusão de números:
Assinatura gerenciada
interface INew {
public:
void DoSomething();
void DoSomething(short s);
void DoSomething(short l);
void DoSomething(float f);
void DoSomething(double d);
}
Assinatura não gerenciada
interface INew {
void DoSomething();
void DoSomething_2(short s);
void DoSomething_3(short l);
void DoSomething_4(float f);
void DoSomething_5(double d);
}
A assinatura COM sistema autônomo métodos aparece sistema autônomo um único DoSomething método seguido por uma série de decorado DoSomething_x métodos, em que x inicia em 2 e incrementos para cada sobrecarregado formulário do método.Observe que alguns dos métodos sobrecarregados podem ser herdadas de um tipo de base.No entanto, não há nenhuma garantia de que métodos sobrecarregados manterá o mesmo número que sistema autônomo avanços de versão do tipo.
Embora os clientes do .NET podem usar a forma do método sobrecarregada, COM clientes precisam acessar os métodos decorados.Objeto navegadores exibem todos os formulários do método decorado com a assinatura do método para permitir que você selecionar o método correto.O cliente da ligação tardia também pode chamar IDispatch::GetIdsOfNames, passando o nome decorado a fim de obter DispID de qualquer método sobrecarregado.
Propriedades
gerenciado classes e interfaces podem ter propriedades.A gerenciado é propriedade de um tipo de dados específicos que pode ter um associado método obter e conjunto método.Esses métodos são definidos separadamente, assim como qualquer Outros método.O exemplo de código a seguir mostra uma interface que contém um Height propriedade. Classes que implementam a interface são necessários para fornecer um get e defina o método para a propriedade.
interface IMammal {
IMammal Mother{get;set;}
IMammal Father{get;set;}
int Height{get;set;}
int Weight{get;set;}
}
class Human : IMammal
{
int weight;
int height;
IMammal father;
IMammal mother;
public IMammal Mother { get { return mother; } set { mother = value; } }
public IMammal Father { get { return father; } set { father = value; } }
public int Height { get { return height; } set { height = value; } }
public int Weight { get { return weight; } set { weight = value; } }
}
Durante a exportar Tlbexp.exe converte o método de conjunto de propriedades [propput] e o método get para [propget].COM o nome da propriedade permanece o mesmo que o nome de propriedade gerenciada.Essa regra possui as seguintes exceções:
Se o tipo de propriedade, eliminando tipos de valor, é uma classe ou interface, o método de conjunto de propriedades se torna [propputref], fornecendo os parâmetros de um nível adicional de indireção.
Se a propriedade tiver não obter ou conjunto o método, Tlbexp.exe omite a propriedade da biblioteca de tipos.
Como propriedades, campos gerenciado são exportados para a biblioteca de tipos.O tempo de execução do marshaling serviço automaticamente gera get e conjunto métodos para todos os campos públicos.Durante o processo de conversão, Tlbexp.exe gera [propput] (ou [propputref]) função e uma função [propget] para cada campo, sistema autônomo mostra a representação de biblioteca tipo seguir.
Representação de biblioteca de tipo
interface IMammal : IDispatch {
[propget] HRESULT Mother([out, retval] IMammal** pRetVal);
[propputref] HRESULT Mother([in] IMammal* pRetVal);
[propget] HRESULT Father([out, retval] IMammal** pRetVal);
[propputref] HRESULT Father([in] IMammal* pRetVal);
[propget] HRESULT Height([out, retval] long* pRetVal);
[propput] HRESULT Height([in] long pRetVal);
[propget] HRESULT Weight([out, retval] long* pRetVal);
[propput] HRESULT Weight([in] long pRetVal);
[propget] HRESULT Age([out, retval] long* pRetVal);
[propput] HRESULT Age([in] long pRetVal);
};
Eventos
Se você não estiver familiarizado com o modelo de evento na interoperabilidade COM, consulte Eventos gerenciado e não gerenciado.Tipos gerenciado implementam evento s usando uma base de delegado evento modelo.Por exemplo, a Class1Events interface no exemplo de código a seguir gera a Click evento.
Public Delegate Sub ClickDelegate()
<GuidAttribute("1A585C4D-3371-48dc-AF8A-AFFECC1B0967"), _
InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIDispatch)>
Public Interface Class1Event
Sub Click ()
End Interface
<ComSourceInterfaces("Class1Event, EventSrc")> _
Public Class Class1
Public Event Click As ClickDelegate
End Class
public delegate void Click();
public interface Class1Event
{
void Click();
}
[ComSourceInterfaces("Class1Event, EventSrc")]
public class Class1
{
public event ClickDelegate Click;
}
Durante a exportar, Tlbexp.exe marca a interface de eventos sistema autônomo a fonte em seu coclass.sistema autônomo mostra o seguinte tipo de biblioteca de representação, o exportado ComClass1Events interface está marcado sistema autônomo interface de fonte.
Representação de biblioteca de tipo
disinterface Class1Event {
properties:
methods:
[id(0x60020000)]
HRESULT Click();
};
coclass Class1
{
…
[default, source] Class1Event;
};
Consulte também
Conceitos
Conversão de assembly exportados
Conversão do parâmetro exportado
Outros recursos
Conjunto de módulos (assembly) Type biblioteca conversão resumo