Esempio di classe COM
Il codice seguente è un esempio di una classe esposta come oggetto COM. Dopo aver inserito questo codice in un file di .cs aggiunto al progetto, impostare la proprietà Registra per interoperabilità COM su True. Per altre informazioni, vedere Procedura: Registrare un componente per l'interoperabilità COM.
L'esposizione di oggetti C# a COM richiede la dichiarazione di un'interfaccia di classe, un'”interfaccia eventi" se necessario e la classe stessa. Per essere visibili per COM i membri della classe devono rispettare le regole seguenti:
- La classe deve essere public.
- Le proprietà, i metodi e gli eventi devono essere public.
- Le proprietà e i metodi devono essere dichiarati nell'interfaccia di classe.
- Gli eventi devono essere dichiarati nell'interfaccia eventi.
Altri membri pubblici nella classe che non si dichiarano in queste interfacce non sono visibili a COM, ma sono visibili ad altri oggetti .NET. Per esporre le proprietà e i metodi a COM, è necessario dichiararli nell'interfaccia di classe e contrassegnarli con un attributo DispId
, nonché implementarli nella classe stessa. L'ordine con cui i membri vengono dichiarati nell'interfaccia è quello usato per la vtable COM. Per esporre gli eventi all'esterno della classe, è necessario dichiararli nell'interfaccia eventi e contrassegnarli con un attributo DispId
. La classe non deve implementare questa interfaccia.
La classe implementa l'interfaccia di classe. È in grado di implementare più interfacce, ma la prima implementazione sarà quella dell'interfaccia di classe predefinita. A questo punto, implementare i metodi e le proprietà esposte a COM, Devono essere pubblici e devono corrispondere alle dichiarazioni presenti nell'interfaccia della classe. Dichiarare anche gli eventi generati dalla classe, Devono essere pubbà e corrispondere alle dichiarazioni presenti nell'interfaccia degli eventi.
Esempio
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
{
}
}