Éviter les arguments Int64 pour les clients Visual Basic 6
Mise à jour : novembre 2007
TypeName |
AvoidInt64ArgumentsForVB6Clients |
CheckId |
CA1406 |
Catégorie |
Microsoft.Interoperability |
Modification avec rupture |
Oui |
Un type marqué spécifiquement comme étant visible dans COM déclare un membre qui accepte un argument System.Int64.
Les clients COM Visual Basic 6 ne peuvent pas accéder aux entiers de 64 bits.
Par défaut, les éléments suivants sont visibles par le modèle COM : assemblys, types publics, membres d'instances publics dans des types publics, et tous les membres de types valeur publics. Toutefois, pour limiter les faux positifs, cette règle requiert que la visibilité COM du type soit déclarée explicitement ; l'assembly contenant doit être marqué avec System.Runtime.InteropServices.ComVisibleAttribute ayant la valeur false et le type doit être marqué avec ComVisibleAttribute ayant la valeur true.
Pour corriger une violation de cette règle pour un paramètre dont la valeur peut toujours être exprimée comme un intégral de 32 bits, remplacez le type de paramètre par System.Int32. Si la valeur du paramètre peut être plus grande que la valeur pouvant être exprimée comme un intégral de 32 bits, remplacez le type de paramètre par System.Decimal. Notez que System.Single et System.Double perdent en précision dans les plages supérieures du type de données Int64. Si le membre ne doit pas être visible dans COM, marquez-le avec ComVisibleAttribute qui a la valeur false.
Il est possible de supprimer sans risque un avertissement de cette règle s'il est certain que les clients COM Visual Basic 6 n'accèdent pas au type.
L'exemple suivant affiche un type qui enfreint la règle.
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) {}
}
}
Éviter les champs non publics dans les types valeur visibles par COM
Éviter les membres statiques dans les types visibles par COM
Marquer les assemblys avec ComVisibleAttribute