Postupy: Ruční vytváření obálk

Note

Tyto pokyny jsou specifické pro .NET Framework. Pro moderní interoperabilitu modelu COM v .NET použijte zdrojově generovanou interoperabilitu modelu COM nebo rozhraní System.Runtime.InteropServices.ComWrappers API. Další informace najdete v tématech Přehled interoperability modelu COM a Generování zdrojového kódu modelu COM.

Pokud se rozhodnete deklarovat typy modelu COM ručně ve spravovaném zdrojovém kódu, je nejlepší začít se stávajícím souborem nebo knihovnou typů jazyka IDL (Interface Definition Language). Pokud soubor IDL nemáte nebo nemůžete vygenerovat soubor knihovny typů, můžete simulovat typy modelu COM vytvořením spravovaných deklarací a exportem výsledného sestavení do knihovny typů.

Simulace typů modelu COM ze spravovaného zdroje

  1. Deklarujte typy v jazyce, který je kompatibilní se specifikací CLS (Common Language Specification) a kompilujte soubor.

  2. Exportujte sestavení obsahující typy s exportérem knihovny typů (Tlbexp.exe).

  3. Jako základ pro deklarování spravovaných typů orientovaných na modelu COM použijte exportovanou knihovnu typů modelu COM.

Vytvořte obálku volatelnou modulem runtime (RCW)

  1. Za předpokladu, že máte soubor IDL nebo soubor knihovny typů, rozhodněte, které třídy a rozhraní chcete zahrnout do vlastní RCW. Můžete vyloučit všechny typy, které nemáte v úmyslu používat přímo nebo nepřímo ve vaší aplikaci.

  2. Vytvořte zdrojový soubor v jazyce kompatibilním se specifikací CLS a deklarujte typy. Úplný popis procesu převodu při importu najdete v tématu Souhrn převodu knihovny typů na sestavení. Při vytváření vlastní rcW ručně provádíte aktivitu převodu typů poskytovanou nástrojem Type Library Importer (Tlbimp.exe). Příklad v další části ukazuje typy v souboru knihovny IDL nebo knihovny typů a jejich odpovídající typy v kódu jazyka C#.

  3. Po dokončení deklarací zkompilujte soubor při kompilaci jakéhokoli jiného spravovaného zdrojového kódu.

  4. Stejně jako u typů importovaných s Tlbimp.exeněkteré vyžadují další informace, které můžete přidat přímo do kódu. Podrobnosti najdete v tématu Postup: Úprava sestavení interopu.

Example

Následující kód ukazuje příklad ISATest rozhraní a SATest třídy v IDL a odpovídající typy ve zdrojovém kódu jazyka C#.

Soubor IDL nebo knihovny typů

 [
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;
 };

Obal ve spravovaném zdrojovém kódu

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 );
 }
}

Viz také