Como: Criar Wrappers manualmente
Se você decidir declarar os tipos COM manualmente no código gerenciado, o melhor lugar para começar é com uma biblioteca existente de arquivo ou tipo de Interface Definition Language (IDL). Quando você não tiver o arquivo IDL ou não é possível gerar um arquivo de biblioteca de tipo, você pode simular tipos COM por meio da criação de declarações gerenciadas e exportar o assembly resultante para uma biblioteca de tipos.
Para simular COM tipos de fonte gerenciado
Declarar os tipos em um idioma que é compatível com a especificação de CLS (Common Language) e compile o arquivo.
Exportar o assembly que contém os tipos com o Type Library Exporter (Tlbexp. exe).
Use a biblioteca de tipos COM exportado como base para declarar orientada COM tipos gerenciados.
Para criar um runtime callable wrapper (RCW)
Supondo que você tenha um arquivo de biblioteca de tipo ou o arquivo IDL, decida quais classes e interfaces que você deseja incluir no RCW personalizado. Você pode excluir todos os tipos que não pretende usar direta ou indiretamente em seu aplicativo.
Criar um arquivo de origem em uma linguagem compatível com CLS e declarar os tipos. Consulte Biblioteca de tipos ao resumo de conversão de Assembly para obter uma descrição completa do processo de conversão de importação. Efetivamente, quando você cria um RCW personalizado, você é executar manualmente a atividade de conversão de tipo fornecida pelo Type Library Importer (Tlbimp. exe). O exemplo que segue este procedimento mostra tipos em um arquivo de biblioteca IDL ou tipo e seus tipos correspondentes no código do C#.
Quando as declarações são concluídas, compile o arquivo como compilar o qualquer outro código fonte gerenciado.
Como ocorre com os tipos importados com Tlbimp. exe, alguns requerem informações adicionais, que podem ser adicionados diretamente ao seu código. Para obter detalhes, consulte como: Editar Assemblies de interoperabilidade.
Exemplo
O código a seguir mostra um exemplo da ISATest interface e SATest a classe em IDL e os tipos correspondentes no C# código de origem.
IDL ou tipo de arquivo de biblioteca
[
object,
uuid(40A8C65D-2448-447A-B786-64682CBEF133),
dual,
helpstring("ISATest Interface"),
pointer_default(unique)
]
interface ISATest : IDispatch
{
[id(1), helpstring("method InSArray")]
HRESULT InSArray([in] SAFEARRAY(int) *ppsa, [out,retval] int *pSum);
};
[
uuid(116CCA1E-7E39-4515-9849-90790DA6431E),
helpstring("SATest Class")
]
coclass SATest
{
[default] interface ISATest;
};
Wrapper no código fonte gerenciado
using System;
using System.Runtime.InteropServices;
using System.Runtime.CompilerServices;
[assembly:Guid("E4A992B8-6F5C-442C-96E7-C4778924C753")]
[assembly:ImportedFromTypeLib("SAServerLib")]
namespace SAServer
{
[ComImport]
[Guid("40A8C65D-2448-447A-B786-64682CBEF133")]
[TypeLibType(TypeLibTypeFlags.FLicensed)]
public interface ISATest
{
[DispId(1)]
//[MethodImpl(MethodImplOptions.InternalCall,
// MethodCodeType=MethodCodeType.Runtime)]
int InSArray( [MarshalAs(UnmanagedType.SafeArray,
SafeArraySubType=VarEnum.VT_I4)] ref int[] param );
}
[ComImport]
[Guid("116CCA1E-7E39-4515-9849-90790DA6431E")]
[ClassInterface(ClassInterfaceType.None)]
[TypeLibType(TypeLibTypeFlags.FCanCreate)]
public class SATest : ISATest
{
[DispId(1)]
[MethodImpl(MethodImplOptions.InternalCall,
MethodCodeType=MethodCodeType.Runtime)]
extern int ISATest.InSArray( [MarshalAs(UnmanagedType.SafeArray,
SafeArraySubType=VarEnum.VT_I4)] ref int[] param );
}
}
Consulte também
Tarefas
Como: Editar Assemblies de interoperabilidade
Referência
Tlbimp. exe (importador da biblioteca)
Tlbexp. exe (exportador da biblioteca)
Conceitos
Personalizando o Runtime Callable Wrappers