Quando desejamos expor um componente .NET para o mundo COM, ele deve ter algumas configurações extras em relação aos componentes que são utilizados somente por aplicações .NET.
Uma das configurações necessárias é definirmos o atributo ClassInterfaceAttribute à classe que será acessada via COM. Esse atributo determinará qual será interface que será exposta para que o mundo COM possa consumí-la. O construtor deste atributo recebe como parametro um dos valores contidos no enumerador ClassInterfaceType. Quando o definimos com o valor ClassInterfaceType.None, indicará que a criação da Interface será fornecida por nós. Neste caso, ao registrar o componente com o Type Library Exporter (Tlbexp.exe), o mesmo será exposto com a primeira interface pública visível encontrada pelo utilitário, definindo assim, a interface padrão do componente para o mundo COM.
Mas e quando existerem mais que uma Interface no componente e, por algum motivo, queremos expor não a primeira Interface pública visível, mas a segunda ou a terceira. A versão 2.0 do .NET Framework introduz um novo atributo chamado ComDefaultInterfaceAttribute que, podemos expecificá-lo no componente. Em seu construtor, devemos especificar a Interface (através de um objeto Type) padrão para o mundo COM. O exemplo abaixo exemplifica o componente decorado com este atributo:
[ClassInterface(ClassInterfaceType.None)]
[ComDefaultInterface(typeof(ILogin)]
public class AuthenticationServices : IData, ILogin
{
//Implementação…
}
Para consumir o componente no mundo COM, podemos fazer (exemplo em VB6):
[ Sem o atributo ComDefaultInterface ]
Dim authService As New AuthenticationServices
Dim login As ILogin
Set login = authService
authService.Update()
MsgBox login.Validate(“IA”, “Pa$$w0rd”)
[ Com o atributo ComDefaultInterface ]
Dim authService As New AuthenticationServices
Dim data As IData
Set data = authService
MsgBox authService.Validate(“IA”, “Pa$$w0rd”)
data.Update()