Compartilhar via


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 de módulo exportado

Conversão de tipo exportado

Conversão do parâmetro exportado

Outros recursos

Conjunto de módulos (assembly) Type biblioteca conversão resumo