Comment : créer manuellement des wrappers
Mise à jour : novembre 2007
Si vous décidez de déclarer des types COM manuellement dans du code source managé, une bibliothèque de types ou un fichier IDL existant constitue le meilleur endroit pour commencer. Lorsque vous ne disposez pas du fichier IDL ou ne pouvez générer un fichier bibliothèque de types, vous pouvez simuler les types COM en créant des déclarations managées et en exportant l'assembly résultant vers une bibliothèque de types.
Pour simuler des types COM à partir d'une source managée
Déclarez les types dans un langage conforme à la spécification de langage commun (CLS, Common Language Specification) et compilez le fichier.
Exportez l'assembly contenant les types à l'aide de Type Library Exporter (Tlbexp.exe).
Utilisez la bibliothèque de types COM exportée comme base permettant de déclarer des types managés orientés COM.
Pour créer un wrapper RCW (Runtime Callable Wrapper)
En partant du principe que vous disposez d'un fichier IDL ou d'un fichier bibliothèque de types, choisissez les classes et les interfaces que vous voulez inclure dans le wrapper RCW personnalisé. Vous pouvez exclure tout type dont vous n'avez pas l'intention de vous servir directement ou indirectement dans votre application.
Créez un fichier source dans un langage conforme CLS et déclarez les types. Consultez Résumé de la conversion d'une bibliothèque de types en assembly pour obtenir une description complète du processus de conversion à l'importation. Cela signifie que lorsque vous créez un wrapper RCW personnalisé, vous effectuez manuellement l'activité de conversion de type fournie par Type Library Importer (TLbimp.exe). L'exemple qui suit cette procédure affiche les types d'un fichier IDL ou d'un fichier de bibliothèque de types, ainsi que les types correspondants, en code C#.
Lorsque les déclarations sont complètes, compilez le fichier de la même manière que vous compilez tout autre code source managé.
Comme pour les types importés à l'aide de Tlbimp.exe, certains types nécessitent des informations supplémentaires que vous pouvez ajouter directement à votre code. Pour plus d'informations, consultez Comment : modifier des assemblys d'interopérabilité.
Exemple
Le code suivant illustre un exemple de l'interface ISATest et de la classe SATest dans IDL et les types correspondants dans le code source C#.
IDL ou fichier bibliothèque de types
[
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 dans du code source managé
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 );
}
}
Voir aussi
Tâches
Comment : modifier des assemblys d'interopérabilité
Concepts
Personnalisation des wrappers pouvant être appelés par le runtime
Référence
Type Library Importer (Tlbimp.exe)
Type Library Exporter, outil (Tlbexp.exe)
Autres ressources
Résumé de la conversion d'une bibliothèque de types en assembly