Los tipos de datos que se pueden copiar son tipos de datos en Microsoft .NET Framework que se presentan de forma idéntica en memoria tanto para código administrado como para código no administrado. Comprender la diferencia entre los tipos que se pueden copiar y los que no, puede facilitar el uso de COM Interop o P/Invoke , dos técnicas para la interoperabilidad en aplicaciones .NET.
Los tipos blitables se utilizan para interactuar entre lenguajes gestionados y proyectos nativos, ya que su representación en memoria compartida permite una transferencia de datos sencilla.
Origen
Una operación de copia de memoria a veces se denomina transferencia de bloques , abreviada como bit blit (y el hardware dedicado para realizar dicha transferencia se llama blitter ). Blittable es un término específico de .NET que indica si es legal copiar un objeto mediante una transferencia de bloques.
Descripción general de la interoperabilidad
La interoperabilidad permite compartir datos y métodos de forma bidireccional entre código no administrado y código .NET administrado . .NET ofrece dos formas de interoperar entre ambos: COM Interop y P/Invoke. Si bien la metodología es diferente, en ambos casos es necesario realizar la serialización (conversión entre representaciones de datos, formatos para llamar a funciones y formatos para devolver valores). COM Interop gestiona esta conversión entre código administrado y objetos COM , mientras que P/Invoke gestiona las interacciones entre código administrado y código Win32 . El concepto de tipos de datos transferibles y no transferibles se aplica a ambos, específicamente al problema de convertir datos entre memoria administrada y no administrada. Esta serialización la realiza el serializador de interoperabilidad, que es invocado automáticamente por el CLR cuando es necesario.
Tipos de Blittable definidos
Un tipo blittable es un tipo de datos que no requiere atención especial del serializador de interoperabilidad porque, por defecto, tiene una representación común en la memoria administrada y no administrada. Al fijar los datos en la memoria, se impide que el recolector de basura los mueva, lo que permite compartirlos directamente con la aplicación no administrada. [ 1 ] Esto significa que tanto el código administrado como el no administrado modificarán las ubicaciones de memoria de estos tipos de manera consistente, y el serializador requiere mucho menos esfuerzo para mantener la integridad de los datos. A continuación, se muestran algunos ejemplos de tipos blittable disponibles en .NET Framework: [ 2 ]
System.ByteSystem.SByteSystem.Int16System.UInt16System.Int32System.UInt32System.Int64System.UInt64System.IntPtrSystem.UIntPtrSystem.SingleSystem.Double
Además, los arreglos unidimensionales de estos tipos (incluidos los búferes fijos no seguros ), así como los tipos complejos que contienen solo campos de instancia (incluidos los campos de solo lectura ) de estos tipos, son compatibles con la copia digital. La presencia de campos estáticos o constantes que no son compatibles con la copia digital no hace que el tipo deje de serlo, ya que dichos campos no participan en la serialización. Los tipos complejos (es decir, las estructuras o clases) también deben tener la disposición de campos de instancia Sequential aplicada mediante el atributo [StructLayout] para que el serializador de .NET los considere compatibles con la copia digital. Las estructuras tienen este atributo aplicado automáticamente por el compilador, pero debe agregarse explícitamente a la definición de una clase para que una clase que de otro modo no sería compatible con la copia digital, lo sea.
Si un tipo no es uno de los tipos que se pueden copiar (blit), se clasifica como no copiable. La razón por la que un tipo se considera no copiable es que, para una representación en la memoria administrada, puede tener varias representaciones potenciales en la memoria no administrada, o viceversa. Alternativamente, puede haber exactamente una representación para el tipo tanto en la memoria administrada como en la no administrada. También es frecuente que simplemente no exista ninguna representación en uno u otro lado. A continuación se muestran algunos tipos no copiables de uso común en .NET Framework: [ 2 ]
System.BooleanSystem.CharSystem.ObjectSystem.String
Hay muchos más tipos que se pueden copiar y otros que no, y los tipos definidos por el usuario pueden encajar en cualquiera de las dos categorías dependiendo de cómo se definan (MSDN).
Uso
Esta noción tan restrictiva de tipos transferibles parece limitar la utilidad de los servicios de interoperabilidad que ofrece .NET, pero no es así. Si bien los tipos transferibles permiten una definición directa de tipos interoperables, existen varias maneras de definir explícitamente cómo debe convertirse un tipo no transferible mediante el serializador de interoperabilidad. [ 3 ] [ 4 ] Por ejemplo, en los lenguajes .NET existen muchos atributos que se pueden aplicar a los campos de los tipos, a los tipos mismos y a los parámetros de los métodos para indicar al serializador cómo manejar esos datos en particular. Estos atributos tienen diversos propósitos, como detallar el empaquetado o la alineación de un tipo, especificar desplazamientos de campos en un tipo, especificar representaciones de matrices o cadenas, controlar el estilo de paso de parámetros para las llamadas a funciones, especificar técnicas de administración de memoria , y más. Si ninguno de los atributos u otras herramientas que se proporcionan en el marco es adecuado, se proporciona un control preciso mediante la capacidad de implementar la ICustomMarshalerinterfaz y realizar manualmente la conversión de datos en ambas direcciones. Comprender qué constituye un tipo que se puede copiar permite al desarrollador identificar situaciones en las que se requiere o no intervención para que un tipo se serialice correctamente. De esta manera, se ahorra tiempo en la sobreespecificación de tipos o llamadas a funciones.
Véase también
Referencias
- ↑ "MSDN Magazine - P/Invoke Revisited" . Msdn.microsoft.com . Consultado el 5 de diciembre de 2011 .
- 1 2 "MSDN - Tipos que se pueden copiar y que no se pueden copiar" . Msdn.microsoft.com . Consultado el 5 de febrero de 2016 .
- ↑ "MSDN - Descripción general de la serialización de interoperabilidad" . Msdn.microsoft.com. 16 de noviembre de 2012. Consultado el 5 de febrero de 2016 .
- ↑ "MSDN - Interoperabilidad de .NET" . Msdn2.microsoft.com. 5 de marzo de 2009. Consultado el 5 de diciembre de 2011 .
Enlaces externos
- Tutorial de P/Invoke
- Tutorial de interoperabilidad COM
- Pinvoke.net
- Guía rápida de P/Invoke en GotDotNet.com
- Revista MSDN: Llamada a DLL de Win32 en C# con P/Invoke
- Terminología .NET