Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Note
Esta orientação é específica para o .NET Framework. Para interoperabilidade COM moderna do .NET, use interoperabilidade COM gerada pelo código-fonte ou a API System.Runtime.InteropServices.ComWrappers. Para mais informações, consulte visão geral da interoperabilidade COM e geração de fontes COM.
Se decidir declarar manualmente os tipos COM no código-fonte gerido, o melhor ponto de partida é com um ficheiro ou biblioteca de tipos Interface Definition Language (IDL) existente. Quando não tem o ficheiro IDL ou não pode gerar um ficheiro de biblioteca de tipos, pode simular os tipos COM criando declarações geridas e exportando o assembly resultante para uma biblioteca de tipos.
Simular tipos COM a partir de código gerido
Declare os tipos numa linguagem que seja compatível com a Common Language Specification (CLS) e compile o ficheiro.
Exporte a assembly que contém os tipos com o Exportador de Bibliotecas de Tipos (Tlbexp.exe).
Utilize a biblioteca de tipos COM exportada como base para declarar tipos geridos orientados para COM.
Criar um wrapper chamável em tempo de execução (RCW)
Assumindo que tens um ficheiro IDL ou uma biblioteca de tipos, decide que classes e interfaces queres incluir no RCW personalizado. Pode excluir quaisquer tipos que não pretenda usar direta ou indiretamente na sua candidatura.
Crie um ficheiro-fonte numa linguagem compatível com CLS e declare os tipos. Consulte o Resumo da Conversão de Biblioteca de Tipos em Assemblagem para obter uma descrição completa do processo de conversão na importação. Na prática, ao criar um RCW personalizado, está a realizar manualmente a atividade de conversão de tipos fornecida pelo Importador de Biblioteca de Tipos (Tlbimp.exe). O exemplo na secção seguinte mostra tipos num IDL ou ficheiro de biblioteca de tipos e os seus tipos correspondentes em código C#.
Quando as declarações estiverem concluídas, compila o ficheiro como compilas qualquer outro código-fonte gerido.
Tal como acontece com os tipos importados com Tlbimp.exe, alguns requerem informação adicional, que pode adicionar diretamente ao seu código. Para mais detalhes, consulte Como: Editar Conjuntos de Interoperabilidade.
Example
O código seguinte mostra um exemplo da ISATest interface e SATest classe no IDL e dos tipos correspondentes no código-fonte C#.
IDL ou ficheiro de biblioteca de tipos
[
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;
};
Encapsulamento em código gerido
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 );
}
}