Pointers.NET

Escrito por Ricardo Lejovitzky   

Soporte para código no administrado en .NET Framework

La plataforma .NET es actualmente el entorno de desarrollo para aplicaciones administrativas y de redes más popular y avanzado existente para Windows y, mediante el uso de Mono Framework, Linux y otros sistemas operativos.

El rápido crecimiento de .NET es explicable, principalmente, por razones de mercado. Sin duda que el impulso de una corporación dominante como Microsoft (y, en menor medida, de Novell al apoyar el desarrollo de Mono) no es algo que deba ignorarse en este análisis, pero, más allá de estas consideraciones, hay otros fundamentos que hacen a .NET merecedor de esta progresiva hegemonía:

 

  • Fue diseñado desde el comienzo como un entorno independiente del lenguaje de programación. A diferencia de Java, sobre .NET se pueden encarar desarrollos en distintos lenguajes (C# y VB .NET son los mas populares), incluso en un mismo proyecto. Por ejemplo, mientras unos programadores pueden desarrollar la interface de usuario usando VB .NET, otros pueden abocarse a la lógica de negocio creando una librería en C# o Delphi.NET.
  • Cuenta con una Biblioteca de Clases (BCL) robusta, muy completa y con una organización interna coherente, facilitando de así el desarrollo.
  • El código compilado es, al igual que Java, independiente de plataforma (ByteCode). Gran parte de los ensamblados generados con .NET para Windows pueden ejecutarse, sin necesidad de recompilar, sobre Linux mediante Mono.
  • Otra característica que lo hace similar a Java es la facilidad en la depuración y la capacidad del compilador en tiempo real (JIT) de detectar errores no encontrados en la fase de compilación. También se puede ajustar la seguridad del ensamblado final, haciendo que este solo funcione en un entorno apto y con los privilegios adecuados.
  • Por ultimo, .NET supera a Java (plataforma en la que se inspira) al brindar un mecanismo de cache de ensamblados (ya compilados en código de maquina) y a la capacidad de sobrepasar los chequeos de seguridad mencionados anteriormente usando los servicios que brinda el sistema operativo en forma directa.

Entonces, un programa en .NET desarrollado en un lenguaje que soporte esta funcionalidad (C#, por ejemplo) puede acceder a direcciones de memoria (Punteros) sin intermediarios trabajando igual que el código compilado en lenguajes clásicos como C o C++.

El uso de esta característica de .NET, llamada código no administrado, no es algo que sea necesario ni recomendable para el desarrollo de aplicaciones habituales de tipo administrativo o gestión tal como se advierte en la documentación oficial de MSDN:

"Para mantener la seguridad de tipos y la seguridad, C# de manera predeterminada no admite la aritmética con punteros. Sin embargo, utilizando la palabra clave unsafe, es posible definir un contexto no seguro en el que se pueden utilizar punteros…

En el Common Language Runtime (CLR), se hace referencia al código no seguro como código no comprobable. El código no seguro en C# no es necesariamente peligroso; simplemente es código cuya seguridad no puede ser comprobada por el CLR. Por consiguiente, el CLR sólo ejecutará código no seguro si se encuentra en un ensamblado de plena confianza. Si utiliza el código no seguro, es su responsabilidad garantizar que su código no introduce riesgos de seguridad o errores de puntero."


Entonces, ¿En que situaciones es conveniente (o incluso necesario) usar Código no administrado?
 

  • Cuando se trabaja con grandes volúmenes de datos frecuentemente, donde el código administrado puede afectar negativamente el rendimiento global de la aplicación. Esto puede ocurrir, por ejemplo, en rutinas de compresión / descompresión, de codificación / decodificación, de generación / verificación de checksums, algoritmos de ordenamiento complejos, etc.
  • Cuando el tiempo de respuesta de la aplicación y la interacción con el usuario es critico. Por ejemplo, cuando se usan rutinas de Video o 3D.
  • Cuando se debe interactuar directamente con el hardware o utilizar funciones y librerías del sistema operativo (API).
  • Cuando se desea economizar al máximo el uso de memoria de la aplicación y evitar copias de memoria redundantes.

Sintetizando, programando con punteros podemos aproximarnos a la economía, flexibilidad y potencia que nos brindan los compiladores clásicos como C / C++ pero usando nuestro lenguaje preferido y sin salirnos de .NET; aunque, como contrapartida, también nos aproximamos a los riesgos que justamente trae aparejado el uso de estos compiladores.

Es por estos riesgos que no todos los lenguajes soportan el código no administrado y por lo cual, para mantener una interface común y equitativa a todos los lenguajes, la BCL no brinda al programador facilidades para su uso.

Entonces, las dificultades para el programador se multiplican dado que además de prestar la atención extra que requiere el desarrollo de este código, también debe trabajar doblemente para desarrollar y depurar rutinas básicas como copiar memoria, ordenar, crear colecciones, etc. Es por eso, que esta característica diferenciadora de Java y extensamente utilizada por Microsoft al desarrollar internamente la BCL, es muy poco usada por los programadores que desarrollan sus proyectos de .NET.

Pointers.NET es un proyecto de código abierto bajo licencia GPL.

Su principal ensamblado (enpalermo.dll) es una extensa librería (de casi 100.000 líneas de código) que brinda este apoyo en las clases y funciones básicas que el programador requiere para poder abocarse exclusivamente al desarrollo de sus propias rutinas.

Clases Principales

NameSpace Pointers.Mem

Clases básicas

  • General: Clase estática con las funciones básicas para trabajo con punteros (Copy, Move, Clean, Fill, Cut y Paste).
  • Heap: Representa una zona de memoria asignada en Heap (API Win32).
  • Numerics: Clase estática con funciones de utilidad para la conversión de enteros en cadenas de bytes y viceversa.
  • PByte y PChar: Estructura que representa una zona de memoria (puntero inicial y largo). Sirve, entre otras cosas, como enumerador que se auto consume a medida que avanza y devuelve fragmentos de acuerdo a delimitadores. Internamente es muy utilizado por las clases y funciones de texto y habilita a la librería el soporte de cadenas de byte nativas (inexistente en .NET).
  • Sort: Clase estática con algoritmos clásicos de ordenamiento, como QuickSort y de desorden aleatorio.
  • Comp: Clase estática con algoritmos de búsqueda y remplazo de cadenas de caracteres, incluyendo el soporte de cadenas de bytes.

NameSpace Pointers.Sys

API Win32

  • Api: Clase estática con los wrappers a funciones de la API Win32.
  • Beep: Clase estática con funciones de utilidad para el acceso al PC-Speaker mediante API.
  • FileAttributeData: Estructura API WIN32_FILE_ATTRIBUTE_DATA.
  • FileTime: Estructura que representa un FileTime de Win32.
  • SystemTime: Estructura que representa un SystemTime de Win32.
  • FileHelpers: Clase estática con funciones de utilidad para el acceso al sistema de archivos mediante API.
  • Info: Clase estática con funciones informativas sobre el entorno.
  • MemInfo: Clase que provee información en tiempo real de la memoria disponible en el sistema.
  • OsInfo: Clase estática con información variada del sistema operativo.
  • Registry: Clase estática con funciones de utilidad para el acceso al Registro de Windows.

NameSpace Pointers.Arr

Arrays

  • ArrGeneral: Clase estática con funciones relativas a la generación y operación con arrays unidimensionales.
  • ArrComp: Clase estática con funciones de búsqueda y reemplazo para Arrays unidimensionales.
  • ArrSort: Clase estática con algoritmos clásicos de ordenamiento (QuickSort) y desorden aleatorio.

NameSpace Pointers.Uti

Utilidades

  • Calc: Clase estática con funciones de utilidad para cálculos numéricos.
  • Crypto: Clase estática con relativas a algoritmos de CheckSum (Hash).
  • Rand: Generador estático de números aleatorios con re inicialización automática.
  • Serializer: Clase estática con funciones de utilidad para serializar, deserializar e interactuar con Streams.
  • Time: Clase estática con funciones de utilidad para el uso de DateTimes.

NameSpace Pointers.Int

IPv4

  • IP: Estructura que representa una IPv4.
  • IPPort: Estructura que representa una IPv4 y un puerto (similar a IPEndPoint).

NameSpace Pointers.Col

Colecciones de Enteros

  • Bytes, Chars, Ints, Longs, PBytes, PChars, SBytes, Shorts, UInts, ULongs, UShorts: Colecciones de enteros basadas en Array subyacentes. A diferencia de las colecciones de la BCL, estas permiten, entre otras cosas, el acceso mediante punteros, la interacción con Streams y la manipulación de cadenas y otras funciones de texto (solo en Bytes y Chars). Aunque todas las colecciones se basan en un mismo modelo de plantilla, estas se conservan en clases individuales (sin usar genéricos) para poder usar sobre ellas e internamente punteros.
  • Strings: Colección de Cadenas con interface similar a las colecciones de enteros.

NameSpace Pointers.Txt

Texto y Cadenas

  • CodePage: Estructura que representa un Código de Página especifico. Brinda mediante API, las mismas funcionalidades que las clases heredadas de System.Text.Encoding.
  • Csv: Funciones estáticas de utilidad para el manejo e interpretación de archivos CSV (texto delimitado).
  • Mutables: Clase estática que permite la creación de Cadenas Mutables. Las Cadenas Mutables son objetos System.String que pueden ser modificados “in situ” en forma segura.
  • NumToStr: Clase estática con funciones relativas a la creación de cadenas que representan números.
  • StrToNum: Estructura que permite la conversión y reconocimiento rápido y flexible de cadenas numéricas.
  • SB: Reemplazo de StringBuilder basado en Col.Chars. Esta clase brinda muchas funciones adicionales al StringBuilder original, entre ellas, la capacidad de acceder e interactuar con punteros.
  • Text: Clase estática con funciones Básicas de tratamiento de Cadenas, como por ejemplo: Clasificación de Caracteres, ToUpper, ToLower, ToProper, Trim, Join, Split y RemoveQuotes.
  • TxtComp: Clase estática con funciones de comparación, búsqueda y reemplazo de cadenas.
  • Validate: Clase estática con funciones de apoyo a la validación de formularios.

NameSpace Pointers.Img

BitMaps

  • ImgGeneral: Clase estática con funciones básicas para la operación con Mapas de Bits (Copy, Fill, etc.).
  • ImgComp: Clase estática con funciones de búsqueda, detección de limites, comparación y reemplazo en Mapas de Bits.
  • ImgUtil: Clase estática con funciones de utilidad relativas a gráficos, fuentes y Render de texto.

Descarga

La última versión de Pointers.NET, junto a los archivos fuente y documentación XML puede descargarse desde este link.

 

Modificado el ( martes, 05 de agosto de 2008 )