Exemplo de classe COM
O código a seguir é um exemplo de uma classe que você exporia como um objeto COM. Depois de colocar esse código em um arquivo de .cs adicionado ao seu projeto, defina a propriedade Register for COM Interop como True. Para obter mais informações, consulte Como registrar um componente para interoperabilidade COM.
Expor objetos C# para COM requer declarar uma interface de classe, uma "interface de eventos", se necessário, e a própria classe. Os membros da classe devem seguir estas regras para serem visíveis para COM:
- A aula deve ser pública.
- Propriedades, métodos e eventos devem ser públicos.
- Propriedades e métodos devem ser declarados na interface de classe.
- Os eventos devem ser declarados na interface do evento.
Outros membros públicos na classe que você não declara nessas interfaces não são visíveis para COM, mas são visíveis para outros objetos .NET. Para expor propriedades e métodos para COM, você deve declará-los na interface de classe e marcá-los com um DispId
atributo e implementá-los na classe. A ordem na qual você declara os membros na interface é a ordem usada para o vtable COM. Para expor eventos de sua classe, você deve declará-los na interface de eventos e marcá-los com um DispId
atributo. A classe não deve implementar essa interface.
A classe implementa a interface de classe; Ele 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. Eles devem ser públicos e devem corresponder às declarações na interface de classe. Além disso, declare os eventos levantados pela classe aqui. Eles devem ser públicos e devem 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
{
}
}