Procedura: creare wrapper manualmente
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
Dichiarare i tipi in un linguaggio conformi a Common Language Specification e compilare il file.
Esportare l'assembly contenente i tipi con l'utilità di esportazione della libreria dei tipi (Tlbexp.exe).
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)
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.
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 pratica, quando si crea un RCW personalizzato, si esegue manualmente la conversione dei tipi fornita dall'utilità di importazione della libreria dei tipi (Tlbimp.exe). Nell'esempio riportato di seguito vengono illustrati i tipi di un file della libreria dei tipi o IDL, indicandone i tipi corrispondenti nel codice C#.
Dopo aver completato le dichiarazioni, compilare il file come si compila qualunque altro codice sorgente gestito.
Come per i tipi importati con Tlbimp.exe, per alcuni sono necessarie ulteriori informazioni, che è possibile aggiungere direttamente al codice. Per informazioni dettagliate, vedere Procedura: modificare assembly di interoperabilità.
Esempio
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 );
}
}
Vedere anche
Attività
Procedura: modificare assembly di interoperabilità
Riferimenti
Tlbimp.exe (utilità di importazione della libreria dei tipi)
Tlbexp.exe (utilità di esportazione della libreria dei tipi)
Concetti
personalizzazione di wrapper di runtime richiamabili
Altre risorse
Riepilogo della conversione da libreria dei tipi ad assembly