Przykładowa klasa modelu COM
Poniższy kod jest przykładem klasy, którą można uwidocznić jako obiekt COM. Po wprowadzeniu tego kodu w pliku .cs dodanym do projektu ustaw właściwość Register for COM Interop na True. Aby uzyskać więcej informacji, zobacz How to: Register a Component for COM Interop (Jak zarejestrować składnik dla międzyoperacjności modelu COM).
Uwidacznianie obiektów języka C# w modelu COM wymaga deklarowania interfejsu klasy, interfejsu "zdarzeń" w razie potrzeby i samej klasy. Składowe klasy muszą być zgodne z tymi regułami, aby były widoczne dla modelu COM:
- Klasa musi być publiczna.
- Właściwości, metody i zdarzenia muszą być publiczne.
- Właściwości i metody należy zadeklarować w interfejsie klasy.
- Zdarzenia muszą być zadeklarowane w interfejsie zdarzenia.
Inne publiczne elementy członkowskie w klasie, których nie deklarujesz w tych interfejsach, nie są widoczne dla modelu COM, ale są one widoczne dla innych obiektów platformy .NET. Aby uwidocznić właściwości i metody modelu COM, należy zadeklarować je w interfejsie klasy i oznaczyć je atrybutem DispId
i zaimplementować je w klasie. Kolejność deklarowania elementów członkowskich w interfejsie jest kolejnością używaną dla tabeli wirtualnej COM. Aby uwidocznić zdarzenia z klasy, należy je zadeklarować w interfejsie zdarzeń i oznaczyć je atrybutem DispId
. Klasa nie powinna implementować tego interfejsu.
Klasa implementuje interfejs klasy; Może zaimplementować więcej niż jeden interfejs, ale pierwsza implementacja jest domyślnym interfejsem klasy. Tutaj zaimplementuj metody i właściwości uwidocznione w modelu COM. Muszą być publiczne i muszą być zgodne z deklaracjami w interfejsie klasy. Ponadto zadeklaruj zdarzenia zgłoszone przez klasę tutaj. Muszą być publiczne i muszą być zgodne z deklaracjami w interfejsie zdarzeń.
Przykład
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
{
}
}