Friday, January 26, 2007

C++/CLI 2.0 Basics - Parte I

- Examen: Application Development Foundation(70-536) - Certification: MCTS - Audiencia: Desarrolladores Actuales usando C#.NET o Visual Basic.NET en .NET 2.0 Introducción: CLI es equivalente a Common Language Infrastructure. C++/CLI es la nueva implementacion de C++ de Microsoft que viene con .NET Framework 2.0 que le supersede a MC++(Managed C++) que venia con .NET Framework 1.1. Debido a que C++/CLI no es y nunca sera portado a Mono o DotGNU, este articulo se centra en programacion para Windows con CLI. Nuestro acostumbrado HelloWorld. 1) Creamos un archivo de texto llamado "Hello.cpp". Podemos usar Notepad o EDIT(yo recomiento usar Notepad++) y colocamos el siguiente codigo: using namespace System; void main(void) { Console::WriteLine("Hola mundo desde C++/CLI"); } 2) Compilamos usando el compilador C++/CLI 2.0. El nombre del compilador es "cl": cl Hello.cpp /clr:safe NOTA: No omita el argumento "/clr:safe", si lo omite el compilador no reconocera parte del codigo. El argumento dado le dice al compilador que se compilara con dependencia al .NET Framework y la ejecucion de codigo es segura. Mas adelante se explicara la diferencia entre el codigo seguro y el que no lo es. 3) Ejecutamos la aplicacion. Hello.cpp Diferencias y similitudes entre C# y Visual Basic. Al igual que C#, se necesita un metodo o funcion principal para ejecutar el codigo. A diferencia de C#, la directiva para abreviar rutas de tipos de datos en C++/CLI es "using namespace"( 2 palabras separadas por un espacio en blanco) y el operador de navegacion no es "."(punto) sino "::"(dos puntos). Aqui observamos la diferencia entre los 3 lenguages. C# using System.Collections.Generics; C++/CLI: using namespace System::Collections::Generics; Visual Basic: imports System.Collections.Generics En Visual Basic y en C# el operador "."(punto) se utiliza para separar namespaces y clases al hacer referencia a clases, metodos, constantes, enumeraciones,variables/propiedades/eventos estaticos. En C++/CLI, el operador "::"(dos puntos) se utiliza para todos estos fines antes mencionados mientras que el uso del operador "." es aplicado a ciertas referencias a objetos que seran explicadas en otro articulo que publicare. Aqui tenemos un ejemplo de como se invoca al metodo estatico "Exists" en la clase "System.IO.File": C# System.IO.File.Exists(..); C++/CLI: System::IO::File::Exists(..); Visual Basic: System.IO.File.Exists(..); Aqui tenemos otro ejemplo al usar una enumeracion en los tres lenguages: C# System.DayOfWeek.Friday C++/CLI: System::DayOfWeek::Friday Visual Basic: System.DayOfWeek.Friday Entendiendo la declaracion de variables en C++/CLI. Para usar variables en C++/CLI, minimo deben declararse. Para declarar variables de forma simple se usa el nombre de el tipo de datos seguido del nombre de la variable. Por ejemplo: int edad; edad = 21; A diferencias de otras versiones de C++, C++/CLI permite declarar variables en todo ambito de codigo(fuera o dentro de clases o metodos). Al igual que C#, se pueden declarar multiples variables de un mismo tipo de dato en una sola linea de codigo: int edadUsted,edadMia,edadOtros; A diferencia de Managed C++(la version anterior a CLI), en CLI existen 2 tipos de datos: Handle y Pointer. Un "handle" requiere un carat(^) en frente de la variable o el tipo de dato y un puntero requiere un asterisco(*). TIP: Si al igual que yo tiene la mala suerte de tener un teclado en español, no encontrara el simbolo "^" directamente en el teclado, el codigo ASCII para el simbolo es "ALT+94". Por ejemplo: String^ miHandle; String * miPointer; Basicamente la diferencias son las siguientes:
  • Handle: Microsoft .NET Garbage Collector SI interviene en la limpieza del objeto, por lo tanto es alojado en una parte de la memoria llamada "Managed Heap","CLR Heap" (o "monton administrado") en el cual el Garbage Collector administra el tiempo de vida de cada objeto. Este tipo de manejo de memoria se conoce como "Administracion de memoria verificable".
  • Pointer: Microsoft .NET Garbage Collector NO interviene en la limpieza del objeto, por lo tanto es alojado en una parte de la memoria llamada "C Runtime Heap", "CRT Heap" ( o "monton del tiempo de ejecucion de C") en el cual la limpieza de cada objeto es responsabilidad del programador. El programador tiene a su disposicion la palabra "delete" para eliminar el objeto cuando ya no es utilizado. Este tipo de manejo de memoria se conoce como "Administracion de memoria inverificable".
Cuando una aplicacion es construida usando C++/CLI solo usando Handles, se conoce como "aplicacion .NET compilada de forma segura". Cuando una aplicacion de .NET es construida usando C++/CLI usando Handles y Pointers al mismo tiempo se conoce como "aplicacion .NET compilada de forma insegura". Porque insegura? El uso de Punteros(Pointers) en el codigo compilado con C++/CLI usando librerias .NET lo convierte en "codigo inseguro" debido a que las capacidades de manejo de memoria usando punteros son ilimitadas al igual que otras versiones de C++, un mal manejo de un puntero podria corromper la memoria de un programa ya sea porque el puntero se salga del limite de la aplicacion(cosa que Windows no permite) o se intente utilizar el objeto con que el puntero esta trabajando despues que se elimino(usando la antigua instruccion "delete"). Normalmente cuando se tiene una aplicacion ya creada en Visual C++ 6 o en una version anterior de C++ Managed o C++/CLI, el codigo puede compilarse de "forma insegura" mientras se migra todo el codigo "inseguro" a "100% Administrado por el CLR".
  • Para compilar una aplicacion con codigo seguro se usa la opcion de compilacion: "/clr:safe".
  • Para compilar una aplicacion con codigo inseguro se usa la opcion de compilacion: "/clr".
Todas las aplicacion creadas con Managed C++, C++/CLI, C# y Visual Basic.NET se conocen como Managed Applications ("Aplicaciones administradas") que quiere decir que son aplicaciones cuya memoria es administrada por el CLR(.NET Common Language Runtime). Esto no quiere decir que el Garbage Collector de CLR actuara sobre toda la memoria de la aplicacion. Tanto MC++,C++/CLI y C# tienen la opcion de manejar el tiempo de vida de los objetos de forma explicita o sin la intervencion del Garbage Collector. TIP: Para usar punteros en C# vea la palabra reservada unsafe. Al hacer instancias o referencias a cualquier clase del FCL(.NET Foundation Class Library)(incluyendo el array y el String) se deben usar Handles en vez de Pointers. Manejo de Arrays y uso de gcnew En otro articulo se explicara como usar las matrices u la instanciacion de clases usando C++/CLI.

No comments: