CLS tipos compatibles en P / Invoke helper conjunto
-
04-10-2019 - |
Pregunta
Tener un ayudante de montaje independiente que contiene sólo declaraciones P / Invoke para componentes legado de 3 ª parte, me pregunto cuál de estas dos formas es tanto mejor se ™ si la asamblea debe estar marcado compatible con CLS:
- Uso
Int32
en un público Declaración de P / Invoke cuando la declaración no administrado tieneunsigned int
. - Uso
UInt32
en un interno Declaración de P / Invoke cuando la declaración no administrado tieneunsigned int
, y se envuelve en un público método que toma unInt32
y la convierte enUInt32
cuando llamar a la método interno.
¿Cuáles son los arriba y desventajas de estos?
Solución
El contador de referencias P / Invoke no va a quejarse cuando la uint se hace demasiado grande, vas a terminar con un int negativo. La capa adicional hace le permiten utilizar el comprobado de palabras clave para generar una OverflowException. Lo cual es bastante conveniente.
si vale la pena la molestia es una cuestión secundaria. Las porciones de las API de Win32, como, sin firmar utilizan como un lógica restricción. Al igual que la longitud de la cadena o el tamaño de un bloque de memoria, nunca puede ser negativo. En la práctica, un número tal, nunca puede desbordarse. Porque no es posible asignar esta cantidad de memoria. No puedo recordar una vez en funcionamiento una API donde estaba un slam-dunk que uint debe ser utilizado. Como tal, creo que estás bien sólo mediante una declaración PInvoke recta con enteros.
Otros consejos
No creo que se obtendría comportamiento correcto si se fue con la opción 1. Int32 sólo puede ir tan alto como 2147483647. Mientras que la unsigned int sube al 4294967295. Como siempre que se sepa que no es necesario ningún valor por encima de 2 mil millones, que en realidad no importa. Pero para ser técnicamente correcto, la interfaz pública debe exponer un tipo grande y llevar a cabo la comprobación de límites para asegurarse de que encaja en un int sin firmar y lanzar una excepción si no lo hace. Int64 hará (9,223,372,036,854,775,807).