Condividi tramite


CA1405: I tipi di base del tipo visibile a COM devono essere visibili a COM

TypeName

ComVisibleTypeBaseTypesShouldBeComVisible

CheckId

CA1405

Category

Microsoft.Interoperability

Breaking Change

DependsOnFix

Causa

Un tipo visibile a COM (Component Object Model) deriva da un tipo non visibile a COM.

Descrizione della regola

Quando un tipo visibile a COM aggiunge membri in una nuova versione, deve attenersi a severe linee guida per evitare di compromettere la funzionalità di client COM associati alla versione corrente. Un tipo invisibile a COM presuppone che non sia necessario rispettare tali regole per la creazione di versioni COM durante l'aggiunta di nuovi membri. Se, tuttavia, un tipo visibile a COM deriva dal tipo invisibile a COM ed espone un'interfaccia di classe ClassInterfaceType.AutoDual o AutoDispatch (l'impostazione predefinita), tutti i membri pubblici del tipo base, a meno che non siano specificatamente contrassegnati come invisibili a COM, con evidente ridondanza, sono esposti a COM. Se il tipo base aggiunge nuovi membri in una versione successiva, potrebbe essere compromessa la funzionalità di tutti i client COM associati all'interfaccia di classe del tipo derivato. Per ridurre la possibilità di compromettere la funzionalità dei client COM, è necessario che i tipi visibili a COM derivino solo da tipi visibili a COM.

Come correggere le violazioni

Per correggere una violazione di questa regola, rendere i tipi di base visibili a COM o il tipo derivato invisibile a COM.

Esclusione di avvisi

Non escludere un avviso da questa regola.

Esempio

Nell'esempio riportato di seguito viene illustrato un tipo che viola la regola.

Imports System
Imports System.Runtime.InteropServices

<Assembly: ComVisibleAttribute(False)>
Namespace InteroperabilityLibrary

   <ComVisibleAttribute(False)> _ 
   Public Class BaseClass

      Sub SomeSub(valueOne As Integer)
      End Sub

   End Class

   ' This class violates the rule.
   <ComVisibleAttribute(True)> _ 
   Public Class DerivedClass
      Inherits BaseClass

      Sub AnotherSub(valueOne As Integer, valueTwo As Integer)
      End Sub

   End Class

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

[assembly: ComVisible(false)]
namespace InteroperabilityLibrary
{
   [ComVisible(false)]
   public class BaseClass
   {
      public void SomeMethod(int valueOne) {}
   }

   // This class violates the rule.
   [ComVisible(true)]
   public class DerivedClass : BaseClass
   {
      public void AnotherMethod(int valueOne, int valueTwo) {}
   }
}

Vedere anche

Riferimenti

System.Runtime.InteropServices.ClassInterfaceAttribute

Concetti

Introduzione all'interfaccia della classe

Altre risorse

Interoperabilità con codice non gestito