Partilhar via


CA1412: marcar interfaces ComSource como IDispatch

TypeName

MarkComSourceInterfacesAsIDispatch

CheckId

CA1412

Categoria

Microsoft.Interoperability

Alteração Significativa

Quebra

Causa

Um tipo é marcado com o atributo de ComSourceInterfacesAttribute e pelo menos uma interface especificada não é marcada com o conjunto de atributos de InterfaceTypeAttribute ao valor de InterfaceIsDispatch .

Descrição da Regra

ComSourceInterfacesAttribute é usado para identificar as interfaces de evento que uma classe expõe ao Component Object Model (COM) clientes.Essas interfaces devem ser expostos como InterfaceIsIDispatch para permitir que os clientes do Visual Basic 6 COM para receber notificações de eventos.Por padrão, se uma interface não é marcada com o atributo de InterfaceTypeAttribute , é exposto como uma interface dupla.

Como Corrigir Violações

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

Quando Suprimir Alertas

Não elimine um alerta desta regra.

Exemplo

O exemplo a seguir mostra uma classe em 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 usar AutoDual ClassInterfaceType

Consulte também

Tarefas

Como acionar eventos manipulados por um coletor COM

Outros recursos

Interoperação com código não gerenciado