Partilhar via


Como: Criar wrappers manualmente

Se você decidir declarar tipos COM manualmente no código fonte gerenciado, o melhor lugar para começar é com uma biblioteca existente de arquivo ou tipo de Interface Definition linguagem (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 gerenciado declarações e exportar o assembly resultante para uma biblioteca de tipos.

Para simular tipos COM da fonte gerenciada

  1. Declarar os tipos em um linguagem que é compatível com CLS (Common linguagem Specification) e compilar o arquivo.

  2. Exportar o assembly que contém os tipos com o Tipo biblioteca Exporter (Tlbexp.exe).

  3. Usar a biblioteca de tipos COM exportado sistema autônomo base para declarar COM orientados de tipos gerenciado.

Para criar um tempo de execução callable wrapper (RCW)

  1. Supondo que você tiver um arquivo IDL ou tipo de arquivo da biblioteca, decida quais classes e interfaces que você deseja incluir no RCW personalizado.Você pode excluir todos os tipos que você não pretende usar diretamente ou indiretamente em seu aplicativo.

  2. criar uma fonte de arquivo em uma linguagem compatível com CLS e declarar os tipos.See Biblioteca de tipo de resumo de conversão de assembly para obter uma descrição completa do processo de conversão de importação.Na verdade, quando você cria um RCW personalizado, você manualmente estiver executando a atividade de conversão de tipo fornecida pelo Tipo biblioteca Importer (Tlbimp.exe).The exemplo seguir este procedimento mostra tipos em um IDL ou arquivo de biblioteca de tipos e seus tipos correspondentes no código translation from VPE for Csharp.

  3. Quando sistema autônomo declarações são concluídas, compile o arquivo sistema autônomo qualquer Outros código fonte gerenciado você compilar.

  4. sistema autônomo ocorre com sistema autônomo tipos importados com Tlbimp.exe, alguns requerem obter informações adicionais, que podem ser adicionados diretamente ao seu código.Para obter detalhes, consulte Como: Edite assemblies de interoperabilidade.

Exemplo

O código a seguir mostra um exemplo do ISATest interface e SATest classe em IDL e os tipos correspondentes no código-fonte translation from VPE for Csharp.

Arquivo de biblioteca de IDL ou tipo

 [
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: edição assemblies de interoperabilidade

Conceitos

Personalizando o tempo de execução Callable Wrappers

Tipos de dados COM

Referência

Tipo Biblioteca Importer (Tlbimp.exe)

Tipo Biblioteca Exporter (Tlbexp.exe)

Outros recursos

Biblioteca de tipo de resumo de conversão de assembly