Delen via


Procedure: Wrappers handmatig maken

Als u besluit com-typen handmatig in beheerde broncode te declareren, kunt u het beste beginnen met een bestaand IDL-bestand (Interface Definition Language) of typebibliotheek. Wanneer u het IDL-bestand niet hebt of geen typebibliotheekbestand kunt genereren, kunt u de COM-typen simuleren door beheerde declaraties te maken en de resulterende assembly te exporteren naar een typebibliotheek.

COM-typen van beheerde bron simuleren

  1. Declareer de typen in een taal die voldoet aan de Common Language Specification (CLS) en compileer het bestand.

  2. Exporteer de assembly met de typen met de typebibliotheekexporteur (Tlbexp.exe).

  3. Gebruik de geëxporteerde COM-typebibliotheek als basis voor het declareren van COM-georiënteerde beheerde typen.

Een runtime aanroepbare wrapper (RCW) maken

  1. Ervan uitgaande dat u een IDL-bestand of typebibliotheekbestand hebt, bepaalt u welke klassen en interfaces u wilt opnemen in de aangepaste RCW. U kunt alle typen uitsluiten die u niet direct of indirect in uw toepassing wilt gebruiken.

  2. Maak een bronbestand in een cls-compatibele taal en declareer de typen. Zie Het overzicht van typebibliotheek naar assemblyconversie voor een volledige beschrijving van het importconversieproces. Wanneer u een aangepaste RCW maakt, voert u handmatig de typeconversieactiviteit uit die wordt geleverd door typebibliotheekimporteur (Tlbimp.exe). In het voorbeeld in de volgende sectie ziet u typen in een IDL- of typebibliotheekbestand en de bijbehorende typen in C#-code.

  3. Wanneer de declaraties zijn voltooid, compileert u het bestand terwijl u andere beheerde broncode compileert.

  4. Net als bij de typen die met Tlbimp.exe worden geïmporteerd, is voor sommige typen aanvullende informatie vereist, die u rechtstreeks aan uw code kunt toevoegen. Zie Procedure voor meer informatie : Interop-assembly's bewerken.

Opmerking

De volgende code toont een voorbeeld van de ISATest interface en SATest klasse in IDL en de bijbehorende typen in C#-broncode.

IDL- of typebibliotheekbestand

 [  
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 in beheerde broncode

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

Zie ook