Creazione manuale di un wrapper

Se si decide di dichiarare manualmente i tipi COM nel codice sorgente gestito, è consigliabile iniziare con una libreria dei tipi o un file IDL esistente. Se non si dispone del file IDL o non è possibile generare un file di libreria dei tipi, simulare i tipi COM mediante la creazione di dichiarazioni gestite e l'esportazione dell'assembly risultante in una libreria dei tipi.

Per simulare i tipi COM dall'origine gestita

  1. Dichiarare i tipi in un linguaggio compatibile con Common Language Specification e compilare il file.
  2. Esportare l'assembly contenente i tipi con l'utilità di esportazione della libreria dei tipi (Tlbexp.exe).
  3. Utilizzare la libreria dei tipi COM esportata come base per la dichiarazione dei tipi gestiti orientati a COM.

Per creare un wrapper di runtime disponibile per la chiamata (RCW)

  1. Se si dispone di un file IDL o di un file di libreria dei tipi, decidere quali classi e interfacce si desidera includere nell'RCW personalizzato. È possibile escludere i tipi che non si intende utilizzare direttamente o indirettamente nell'applicazione.

  2. Creare un file di origine in un linguaggio compatibile con Common Language Specification e dichiarare i tipi. Per una descrizione completa del processo di conversione dell'importazione, vedere Riepilogo della conversione da libreria dei tipi ad assembly. In effetti, quando si crea un RCW personalizzato, si esegue manualmente la conversione dei tipi fornita dall'utilità di importazione della libreria dei tipi (Tlbimp.exe).

    Nel codice riportato di seguito viene mostrato un esempio dell'interfaccia ISATest e della classe SATest in IDL, nonché i tipi corrispondenti nel codice sorgente C#.

    File della libreria dei tipi o IDL

     [
    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 nel codice sorgente gestito

    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 );
     }
    }
    
  3. Dopo aver completato le dichiarazioni, compilare il file come si compila qualunque altro codice sorgente gestito.

  4. Come per i tipi importati con Tlbimp.exe, per alcuni sono necessarie ulteriori informazioni, che è possibile aggiungere direttamente al codice. Per informazioni dettagliate, vedere Modifica di un assembly di interoperabilità.

Vedere anche

Personalizzazione dei wrapper di runtime disponibili per la chiamata | Tipi di dati COM | Modifica di un assembly di interoperabilità | Riepilogo della conversione da libreria dei tipi ad assembly