Partilhar via


Personalizando COM Callable Wrappers

Personalizando um COM Callable Wrapper é uma tarefa simples. Se o tipo que você deseja expor para um COM o cliente tem requisitos de empacotamento diferente do padrão, aplicar o System.Runtime.InteropServices.MarshalAsAttribute atributo para um parâmetro de método, o campo classe ou o valor de retorno para alterar o comportamento de empacotamento.

Como mostra a ilustração a seguir, você pode exportar uma DLL gerenciada sem Personalizando o wrapper (mostrado à esquerda). Ou adicione informações de empacotamento para a fonte, compilá-lo e usar o Type Library Exporter (Tlbexp. exe) para exportar a DLL modificada e produzir um wrapper personalizado.

Informações de empacotamento de DLLs exportadas

Exportador da biblioteca de tipos

Observação

Gerenciado por todos os tipos, métodos, propriedades, campos e eventos que você deseja expor COM devem ser públicos.Tipos devem ter um construtor público padrão, que é o único construtor que pode ser chamado usando com.Para obter informações adicionais, consultequalificação.NET tipos de interoperação..

Quando o empacotamento de dados entre código gerenciado e o empacotador de interoperabilidade deve reconhecer as representações dos dados sendo passados:

  • Para blittable tipos de representações gerenciados e são sempre os mesmos. Por exemplo, um inteiro de 4 bytes sempre é empacotado como um inteiro de 4 bytes. O empacotador de interoperabilidade usa a assinatura gerenciada para determinar a representação de dados.

  • Para não é blittable tipos de empacotador de interoperabilidade reconhece a representação gerenciado da sua assinatura do método, mas não consegue fazer o mesmo para a representação não gerenciada. Para empacotar os tipos de não-blittable, você pode usar uma das seguintes técnicas:

    • Permitir que o empacotador inferir a representação da representação gerenciada.

    • Forneça a representação de dados não gerenciados explicitamente.

Por exemplo, uma seqüência de caracteres é convertida em um BSTR tipo quando empacotados de gerenciado para código não gerenciado, a menos que você explicitamente aplicar o MarshalAsAttribute para empacotar a seqüência de caracteres para outro tipo, como LPWSTR. Você pode aplicar esse atributo para um parâmetro, o campo, ou valor de retorno dentro da origem de definição de tipo, conforme mostrado nos exemplos a seguir.

Aplicar o MarshalAsAttribute para um parâmetro

Public Sub M1(<MarshalAs(UnmanagedType.LPWStr)> msg As String)
    ' ...
End Sub
void M1([MarshalAs(UnmanagedType.LPWStr)] string msg)
{
    // ...
}
void M1([MarshalAs(UnmanagedType::LPWStr)] String^ msg)
{
    // ...
}

Aplicar o MarshalAsAttribute para um campo de uma classe.

Class MsgText
    <MarshalAs(UnmanagedType.LPWStr)> _
    Public msg As String = ""
End Class
class MsgText
{
    [MarshalAs(UnmanagedType.LPWStr)]
    public string msg = "";
}
ref class MsgText
{
public:
    [MarshalAs(UnmanagedType::LPWStr)]
    String^ msg;

    MsgText()
    {
        msg = "";
    }
};

Aplicar o MarshalAsAttribute para um valor de retorno

Public Function M2() As <MarshalAs(UnmanagedType.LPWStr)> String
    Dim msg As New String(New char(128){})
    ' Load message here ...
    Return msg
End Function
[return: MarshalAs(UnmanagedType.LPWStr)]
public string GetMessage()
{
    string msg = new string(new char[128]);
    // Load message here ...
    return msg;
}
[returnvalue: MarshalAs(UnmanagedType::LPWStr)]
String^ GetMessage()
{
    String^ msg = gcnew String(gcnew array<Char>(128));
    // Load message here ...
    return msg;
}

Você pode definir o System.Runtime.InteropServices.UnmanagedType enumeração para indicar o formato desejado do tipo não gerenciado. Em assinaturas anteriores, msg dados são empacotados como um buffer de terminação nula de caracteres Unicode (LPWStr).

Às vezes, o empacotador de interoperabilidade requer que mais informações do que são fornecidas no formato de dados gerenciados e não gerenciados. Para empacotar uma matriz, por exemplo, você deve fornecer o tipo de elemento, posição, tamanho e limites da matriz. Você pode usar o MarshalAsAttribute para especificar informações adicionais necessárias.

Consulte também

Referência

Personalizando COM Callable Wrappers

Conceitos

Tipos de dados COM

Personalizando o Runtime Callable Wrappers

Outros recursos

O empacotamento de dados com a interoperabilidade COM

Comportamento de empacotamento padrão