Exemplo de classe COM

O código a seguir é um exemplo de uma classe que você poderia expor como um objeto COM. Depois de posicionar o código em um arquivo .cs adicionado a seu projeto, defina a propriedade Registrar para interoperabilidade COM como True. Para obter mais informações, consulte Como registrar um componente para interoperabilidade COM.

A exposição de objetos do C# para COM requer a declaração de uma interface de classe, de uma “interface de eventos” se necessário e da própria classe. Os membros de classe devem seguir estas regras para ficarem visíveis ao COM:

  • A classe deve ser pública.
  • As propriedades, os métodos e os eventos devem ser públicos.
  • As propriedades e os métodos devem ser declarados na interface de classe.
  • Os eventos devem ser declarados na interface de eventos.

Outros membros públicos da classe que não são declarados nessas interfaces não estarão visíveis para COM, mas eles ficarão visíveis para outros objetos .NET. Para expor propriedades e métodos ao COM, você deve declará-los na interface de classe e marcá-los com um atributo DispId e implementá-los na classe. A ordem de declaração dos membros na interface é a ordem usada para a vtable do COM. Para expor eventos de sua classe, você deve declará-los na interface de eventos e marcá-los com um atributo DispId. A classe não deve implementar essa interface.

A classe implementa a interface de classe. Ela pode implementar mais de uma interface, mas a primeira implementação é a interface de classe padrão. Implemente os métodos e propriedades expostos ao COM aqui. Ela deve ser marcada como pública e deve corresponder às declarações na interface de classe. Além disso, declare aqui os eventos acionados pela classe. Ela deve ser pública e deve corresponder às declarações na interface de eventos.

Exemplo

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

Confira também