CA1412: Interfaces de marca ComSource como IDispatch

TypeName

MarkComSourceInterfacesAsIDispatch

CheckId

CA1412

<strong>Categoria</strong>

Microsoft.Interoperability

Alteração significativa

Quebrando

Causa

Um tipo é marcado com o ComSourceInterfacesAttribute atributo e pelo menos uma interface especificada não está marcado com o InterfaceTypeAttribute atributo definido como o InterfaceIsDispatch valor.

Descrição da regra

ComSourceInterfacesAttributeé usado para identificar as interfaces de evento que uma classe expõe aos clientes do modelo de objeto componente (COM). Essas interfaces devem ser expostas como InterfaceIsIDispatch para permitir que clientes COM 6 de Visual Basic receber notificações de evento. Por padrão, se uma interface não está marcada com o InterfaceTypeAttribute atributo, ele é exposto como uma interface dupla.

Como corrigir violações

Para corrigir uma violação desta regra, adicionar ou modificar o InterfaceTypeAttribute de atributo para que seu valor é definido para InterfaceIsIDispatch para todas as interfaces que são especificadas com o ComSourceInterfacesAttribute atributo.

Quando suprimir avisos

Não suprimir um aviso da regra.

Exemplo

O exemplo a seguir mostra uma classe onde uma das interfaces viola a regra.

Imports Microsoft.VisualBasic
Imports System
Imports System.Runtime.InteropServices

<Assembly: ComVisibleAttribute(True)>
Namespace InteroperabilityLibrary

   ' This violates the rule for type EventSource.
   <InterfaceType(ComInterfaceType.InterfaceIsDual)> _ 
   Public Interface IEventsInterface
      Sub EventOne
      Sub EventTwo
   End Interface

   ' This satisfies the rule.
   <InterfaceType(ComInterfaceType.InterfaceIsIDispatch)> _ 
   Public Interface IMoreEventsInterface
      Sub EventThree
      Sub EventFour
   End Interface

   <ComSourceInterfaces( _
      "InteroperabilityLibrary.IEventsInterface" & _ 
      ControlChars.NullChar & _ 
      "InteroperabilityLibrary.IMoreEventsInterface")> _
   Public Class EventSource
      ' Event and method declarations.
   End Class

End Namespace
using System;
using System.Runtime.InteropServices;

[assembly: ComVisible(true)]
namespace InteroperabilityLibrary
{
   // This violates the rule for type EventSource.
   [InterfaceType(ComInterfaceType.InterfaceIsDual)]
   public interface IEventsInterface
   {
      void EventOne();
      void EventTwo();
   }

   // This satisfies the rule.
   [InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
   public interface IMoreEventsInterface
   {
      void EventThree();
      void EventFour();
   }

   [ComSourceInterfaces(
      "InteroperabilityLibrary.IEventsInterface\0" + 
      "InteroperabilityLibrary.IMoreEventsInterface")]
   public class EventSource
   {
      // Event and method declarations.
   }
}

Regras relacionadas

CA1408: Não use ClassInterfaceType de AutoDual

Consulte também

Tarefas

Como: Gerar eventos manipulados por um coletor COM

Outros recursos

Interoperação com Código Não Gerenciado