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