CLS types conformes à l'assemblage auxiliaire P / Invoke
-
04-10-2019 - |
Question
Avoir une aide contenant l'ensemble des déclarations que P / Invoke distinctes pour les composants de 3e héritage du parti, je me demande laquelle de ces deux façons est le meilleur ™ si l'ensemble doit être conforme CLS marqué:
- Utilisez
Int32
dans un publique Déclaration de P / Invoke où la déclaration aunsigned int
non géré. - Utilisez
UInt32
dans un interne Déclaration de P / Invoke où la déclaration non gérée aunsigned int
, et l'envelopper dans une méthode publique qui prend unInt32
et le convertit enUInt32
quand appelant la méthode interne .
Quels sont les haut et les inconvénients de ces?
La solution
Le placier P / Invoke ne va pas se plaindre quand le uint devient trop grand, vous allez finir avec un int négatif. La couche supplémentaire ne vous permet d'utiliser le coché mot-clé pour générer un OverflowException. Ce qui est assez souhaitable.
Que ce soit en valeur la dispute est une question secondaire. Beaucoup d'API, comme Win32, utilisez Unsigned comme logique contrainte. Comme la longueur de la chaîne ou la taille d'un bloc de mémoire, il ne peut jamais être négatif. Dans la pratique, un tel nombre ne peut jamais déborder. Parce qu'il est impossible d'attribuer autant de mémoire. Je ne me souviens pas en cours d'exécution une fois dans une API où il était un slam-dunk qui uint doit être utilisé. En tant que tel, je pense que vous allez bien juste en utilisant une déclaration de PInvoke droite avec ints.
Autres conseils
Je ne pense pas que vous obtiendrez un comportement correct si vous êtes allé avec l'option 1. Int32 ne peut aller aussi haut que 2.147.483.647. Alors que le unsigned int va jusqu'à 4.294.967.295. Tant que vous savez que vous ne avez pas besoin de valeurs supérieures à 2 milliards, il ne compte pas vraiment. Mais pour être techniquement correct, l'interface publique devrait exposer un type plus grand et effectuer la vérification des limites pour vous assurer qu'il convient dans un unsigned int et lancer une exception si elle ne fonctionne pas. Un Int64 fera (9,223,372,036,854,775,807).