Поделиться через


Пример COM-класса

Следующий код является примером класса, который будет предоставляться в виде COM-объекта. После размещения этого кода в .cs-файле, добавленном в проект, задайте для свойства Register for COM Interop значение True. Дополнительные сведения см. в разделе Практическое руководство. Регистрация компонента для COM-взаимодействия.

Предоставление объектов C# com требует объявления интерфейса класса, интерфейса событий при необходимости и самого класса. Члены класса должны соответствовать указанным ниже правилам, чтобы стать доступными для COM.

  • Класс должен быть открытым.
  • Свойства, методы и события должны быть открытыми.
  • Свойства и методы должны быть объявлены в интерфейсе класса.
  • События должны быть объявлены в интерфейсе событий.

Другие общедоступные члены класса, которые не объявляются в этих интерфейсах, не видны COM, но они видны другим объектам .NET. Чтобы предоставить свойства и методы COM, их необходимо объявить в интерфейсе класса, пометить атрибутом DispId и реализовать в классе. Порядок объявления элементов в интерфейсе — это порядок, используемый для vtable COM. Чтобы предоставить события из класса, их необходимо объявить в интерфейсе событий и пометить атрибутом DispId. Класс не должен реализовывать этот интерфейс.

Класс реализует интерфейс класса; он может реализовать несколько интерфейсов, но первая реализация — это интерфейс класса по умолчанию. Реализуйте методы и свойства, доступные модели COM здесь. Они должны быть общедоступными и должны соответствовать объявлениям в интерфейсе класса. Кроме того, объявите здесь события, инициируемые классом. Они должны быть общедоступными и должны соответствовать объявлениям в интерфейсе событий.

Пример

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
    {
    }
}

См. также