Exemple de classe COM
Le code suivant est un exemple de classe pouvant être exposée en tant qu’objet COM. Après avoir placé ce code dans un fichier .cs et l’avoir ajouté à votre projet, affectez la valeur True à la propriété Inscrire pour COM Interop. Pour plus d’informations, consultez Guide pratique pour inscrire un composant pour COM Interop.
L’exposition d’objets C# à COM nécessite de déclarer une interface de classe, une « interface d’événements » si nécessaire, et la classe proprement dite. Les membres de classe doivent suivre ces règles pour être visibles par COM :
- La classe doit être publique.
- Les propriétés, méthodes et événements doivent être publics.
- Les propriétés et méthodes doivent être déclarées dans l’interface de classe.
- Les événements doivent être déclarés dans l’interface d’événement.
Les autres membres publics de la classe qui ne sont pas déclarés dans ces interfaces ne sont pas visibles par COM, mais ils sont visibles par d’autres objets .NET. Pour exposer des propriétés et des méthodes à COM, vous devez les déclarer sur l’interface de classe, les marquer avec un attribut DispId
et les implémenter dans la classe. L’ordre dans lequel vous déclarez les membres dans l’interface correspond à l’ordre utilisé pour la vtable COM. Pour exposer des événements à partir de votre classe, vous devez les déclarer sur l’interface d’événement et les marquer avec un attribut DispId
. La classe ne doit pas implémenter cette interface.
La classe implémente l’interface de classe ; elle peut implémenter plusieurs interfaces, mais la première implémentation représente l’interface de classe par défaut. Implémentez ici les méthodes et propriétés exposées à COM. Elles doivent être publiques et correspondre aux déclarations dans l’interface de classe. Vous devez aussi déclarer ici les événements déclenchés par la classe. Elles doivent être publiques et correspondre aux déclarations dans l’interface d’événement.
Exemple
using System.Runtime.InteropServices;
namespace project_name
{
[Guid("EAA4976A-45C3-4BC5-BC0B-E474F4C3C83F")]
public interface ComClass1Interface
{
}
[Guid("7BD20046-DF8C-44A6-8F6B-687FAA26FA71"),
InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface ComClass1Events
{
}
[Guid("0D53A3E8-E51A-49C7-944E-E72A2064F938"),
ClassInterface(ClassInterfaceType.None),
ComSourceInterfaces(typeof(ComClass1Events))]
public class ComClass1 : ComClass1Interface
{
}
}