CLS tipi compliant in P / Invoke aiutante di montaggio
-
04-10-2019 - |
Domanda
Avere un aiutante separato contenente solo le dichiarazioni di montaggio P / Invoke per eredità 3rd componenti di partito, mi chiedo quale di questi due modi è quello migliore ™ se l'assemblea deve essere contrassegnato compatibile con CLS:
- Usa
Int32
in un pubblico dichiarazione P / Invoke in cui la dichiarazione non gestito haunsigned int
. - Usa
UInt32
in un dichiarazione interno P / Invoke in cui la dichiarazione non gestito haunsigned int
, e avvolgerlo in un pubblico metodo che accetta unInt32
e lo converte inUInt32
quando chiamando il metodo interno.
Quali sono i lati negativi a monte ea questi?
Soluzione
Il marshaller P / Invoke non è andare a lamentarsi quando l'uint diventa troppo grande, devi semplicemente finire con un int negativo. Lo strato supplementare fa consentono di utilizzare il controllato parola chiave per generare un OverflowException. Il che è abbastanza desiderabile.
Sia che vale la fatica è una questione secondaria. Un sacco di API, come Win32, usano non firmato come logico vincolo. Come la lunghezza della stringa o la dimensione di un blocco di memoria, non può mai essere negativo. In pratica, tale numero può mai troppo pieno. Poiché non è possibile allocare altrettanta memoria. Non riesco a ricordare in esecuzione una volta in un'API in cui si trattava di una schiacciata che uint dovrebbe essere usato. Come tale, è penso che stai bene solo con una dichiarazione PInvoke dritto con int.
Altri suggerimenti
Non credo che si otterrebbe comportamento corretto se si è andato con l'opzione 1. Int32 non può che andare più in alto 2.147.483.647. Considerando che il unsigned int sale a 4.294.967.295. Finché sai che non è necessario alcun valore al di sopra di 2 miliardi, non ha molta importanza. Ma per essere tecnicamente corretta, l'interfaccia pubblica dovrebbe esporre un tipo più grande ed eseguire il controllo dei limiti per assicurarsi che si adatta in un unsigned int e un'eccezione se non è così. Un Int64 farà (9,223,372,036,854,775,807).