CA1406: Int64-Argumente für Visual Basic 6-Clients vermeiden
TypeName |
AvoidInt64ArgumentsForVB6Clients |
CheckId |
CA1406 |
Kategorie |
Microsoft.Interoperability |
Unterbrechende Änderung |
Breaking |
Ursache
Ein Typ, der ausdrücklich als für COM (Component Object Model) sichtbar markiert ist, deklariert einen Member, der ein System.Int64-Argument akzeptiert.
Regelbeschreibung
Visual Basic 6-COM-Clients können nicht auf 64-Bit-Ganzzahlen zugreifen.
Standardmäßig sind folgende Programmierelemente für COM sichtbar: Assemblys, öffentliche Typen, öffentliche Instanzmember in öffentlichen Typen und alle Member öffentlicher Werttypen. Um jedoch die Anzahl falscher positiver Ergebnisse zu verringern, muss entsprechend der Regel die COM-Sichtbarkeit des Typs explizit angegeben werden, die enthaltende Assembly muss mit dem auf false festgelegten System.Runtime.InteropServices.ComVisibleAttribute-Attribut markiert sein, und der Typ muss mit dem auf true festgelegten ComVisibleAttribute-Attribut markiert sein.
Behandeln von Verstößen
Um einen Verstoß gegen diese Regel für einen Parameter, dessen Wert immer als 32-Bit-Ganzzahl ausgedrückt werden kann, zu beheben, ändern Sie den Parametertyp in System.Int32. Wenn der Wert des Parameters größer sein darf, als mit einer 32-Bit-Ganzzahl ausgedrückt werden kann, ändern Sie den Parametertyp in System.Decimal. Beachten Sie, dass sowohl System.Single als auch System.Double in den oberen Bereichen des Int64-Datentyps an Genauigkeit verlieren. Wenn ein Member nicht für COM sichtbar sein soll, markieren Sie diesen mit dem auf false festgelegten ComVisibleAttribute.
Wann sollten Warnungen unterdrückt werden?
Eine Warnung dieser Regel kann gefahrlos unterdrückt werden, wenn sichergestellt ist, dass keine Visual Basic 6-COM-Clients auf den Typ zugreifen.
Beispiel
Im folgenden Beispiel wird ein Typ veranschaulicht, der gegen die Regel verstößt.
Imports System
Imports System.Runtime.InteropServices
<Assembly: ComVisibleAttribute(False)>
Namespace InteroperabilityLibrary
<ComVisibleAttribute(True)> _
Public Class SomeClass
Public Sub LongArgument(argument As Long)
End Sub
End Class
End Namespace
using System;
using System.Runtime.InteropServices;
[assembly: ComVisible(false)]
namespace InteroperabilityLibrary
{
[ComVisible(true)]
public class SomeClass
{
public void LongArgument(long argument) {}
}
}
Verwandte Regeln
CA1413: Nicht öffentliche Felder in für COM sichtbaren Werttypen vermeiden
CA1407: Statische Member in für COM sichtbaren Typen vermeiden
CA1017: Assemblys mit ComVisibleAttribute markieren