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
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
Personalizando o Runtime Callable Wrappers