Framework .NET 3.5 06 Operativa básica del framework .net

1,092 views

Published on

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,092
On SlideShare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
8
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Framework .NET 3.5 06 Operativa básica del framework .net

  1. 1. Operativa básica del Framework .NET<br />Interfaces estándar<br />Delegados y Eventos<br />Excepciones<br />Atributos<br />Colecciones<br />Globalización y localización<br />Interoperabilidad<br />Hilos y Servicios<br />
  2. 2. Operativa básica del Framework .NET<br />Interfaces estándar<br />Para que nuestras clases puedan ser utilizadas por código cliente en la misma forma que las del propio sistemas, han de implementar los correspondientes interfaces estándar, los principales de los cuales se relacionan a continuación:<br />IComparable: permite la comparación de dos instancias del mismo tipo, con el método CompareTo permitiendo la ordenación de una lista de elementos de este tipo.<br />IEquatable: para poder determinar la igualdad entre dos instancias del mismo tipo, mediante el método Equals.<br />IConvertible: para especificar las operaciones para convertir nuestro tipo a una variedad de tipos del sistema, ToXxxx.<br />ICloneable: para devolver una copia idéntica de un a instancia de nuestro tipo en otro objeto, mediante Clone.<br />IFormattable: para devolver un String con un determinado formato, a partir de una instancia de nuestro tipo. Útil para la salida a pantalla o listado con el método ToString().<br />IDisposable: nos permitirá generar un método Dispose, para liberar los recursos utilizados en cuanto sea necesario.<br />
  3. 3. Operativa básica del Framework .NET<br />Delegados y Eventos<br />Los delegados son el equivalente, en programación orientada a objetos, a los punteros a función de otros lenguajes, como el C++. Aunque con una seguridad de tipos incrementada y un uso muy diferenciado con respecto a sus antecesores.<br />Se utilizan principalmente en los retornos de funciones (callbacks), llamadas asíncronas, ejecuciones diferidas y en la gestión de eventos. En todos los casos, como forma de especificar la firma del método a ejecutar.<br />En la operativa habitual sólo utilizaremos los eventos asociados al interfaz de usuario de nuestra aplicación, mediante las facilidades que nos suministra el IDE o en el caso de implementar llamadas asíncronas con Threading.<br />Pero podemos definir delegados y eventos a nuestra conveniencia, asociados a la lógica de negocio, y lanzar la ejecución en el momento oportuno.<br />public class AccountEventArgs : EventArgs {// Custom event argument class.<br /> private double _balance;<br /> public AccountEventArgs(double b) {<br /> _balance = b;<br /> }<br /> public double Balance {<br /> get { return _balance; }<br /> }<br />}<br />public class Account { // Account class, defines two public events.<br /> public event EventHandler<AccountEventArgs> AccountInDeficit;<br /> public event EventHandler<AccountEventArgs> AccountInCredit;<br />}<br />public class Account {<br /> …<br /> private double _balance;<br /> …<br /> public void Deposit(double amount) {<br /> _balance += amount;<br /> if (_balance > 0 && _balance <= amount) { // Moved into credit, raise the AccountInCredit event.<br /> EventHandler<AccountEventArgs> handler = AccountInCredit; <br /> if (handler != null) {<br /> AccountEventArgs args = new AccountEventArgs(_balance);<br /> handler(this, args);<br /> }<br /> }<br /> }<br />}<br />Account acc1 = new Account("Jane"); // Create an Account object.<br />acc1.AccountInCredit += OnAccountInCredit; // Handle the AccountInCredit event on the Account object.<br />acc1.Withdraw(100); // Deposit and withdraw some money.<br />acc1.Deposit(50);<br />acc1.Deposit(70);<br />void OnAccountInCredit(object sender, AccountEventArgs args) // Event-handler for AccountInCredit event<br />{<br /> double balance = args.Balance;<br /> Console.WriteLine("Account in credit, new balance: {0:c}", balance);<br />}<br />
  4. 4. Operativa básica del Framework .NET<br />Excepciones<br />Las excepciones son el sistema mediante el que el Framework .NET implementa el control y gestión de los errores y problemas que se puedan producir durante la ejecución del código de una forma controlada y uniforme.<br />Todos los métodos propios del Framework utilizan este sistema para indicar los fallos.<br />Podemos definir y utilizar nuestras propias excepciones, heredando de System.Exception o de una de sus subclases, para ampliar la información aportada por el sistema o para especificar circunstancias de negocio o no contempladas por el Framework, para lo cual utilizaremos la palabra clave throw.<br />Para controlar la posible ocurrencia de una excepción en un bloque de código habremos de emplear las palabras clave de bloque Try…Catch…Finally.<br />Las excepciones están estructuradas en jerarquías, las cuales habrán de ser tenidas en cuenta a la hora de controlar los posibles errores en la ejecución.<br />Manejo de excepciones<br />
  5. 5. Operativa básica del Framework .NET<br />Atributos<br />Los atributos son la herramienta de la que disponemos para añadir metadatos en los ensamblados, asociándolos a cada objeto, tipos o miembros, destino de los mismos.<br />Son declaraciones descriptivas de tipo palabras clave asociadas a tipos, campos, métodos o propiedades. <br />Estos atributos se salvan con los metadatos y permiten describir el código al CLR o, incluso, modificar el comportamiento de la aplicación en tiempo de ejecución.<br />Permiten, entre otras, indicar la forma en la que se han de serializar los datos, especificar características de seguridad, limitar el alcance de la optimización de la compilación Just-In-Time, de forma que el código sea fácil de depurar.<br />Otra de las funcionalidades para las que se utilizan los atributos es para añadir descripciones útiles para los desarrolladores que vayan a utilizar servicios que hayamos desarrollado y pongamos a su disposición.<br />
  6. 6. Operativa básica del Framework .NET<br />Colecciones<br />En el Framework disponemos de una amplia gama de clases de colección para contener objetos, las cuales permiten mayor flexibilidad que los arrays porque son serializables y disponen de métodos que nos permiten añadir, eliminar y acceder a los elementos de la colección.<br />Disponemos de colecciones orientadas a objetos, las cuales residen en el espacio de nombres System.Collections, como pueden ser ArrayList, Queue, Stack, Hashtable, SortedList o BitArray.<br />También hay colecciones genéricas, en el espacio de nombres System.Collections.Generic, por ejemplo List<T>, Queue<T>, LinkedList<T>, Stack<T>, SortedDictionary<TKey,TValue>, Dictionary<TKey,Tvalue> o SortedList<TKey,TValue>.<br />Finalmente tenemos las colecciones especializadas en el espacio de nombres System.Collections.Specialized, como StringDictionary, ListDictionary, HybridDictionary, OrderedDictionary, NameObjectCollectionBase(abstract), NameValueCollection, CollectionsUtilclass, BitVector32 structure o StringCollection,.<br />
  7. 7. Operativa básica del Framework .NET<br />Espacio de nombres System.Collections<br />Interfaces de colección<br />Interfaces de comparación<br />Ienumerable<br />GetEnumerator<br />IComparer<br />Icollection<br />Count<br />IsSynchronized<br />SyncRoot<br />CopyTo<br />IEqualityComparer<br />Interfaces enumeración<br />Ilist<br />IsFixedSize <br />IsReadOnly <br />Item <br />Add <br />Clear<br />Contains<br />IndexOf<br />Insert<br />Remove<br />RemoveAt<br />Idictionary<br />IsFixedSize <br />IsreadOnly<br />Item<br />Keys<br />Values<br />Add <br />Clear<br />Contains<br />GetEnumerator<br />Remove<br />Ienumerator<br />Current<br />MoveNext<br />Reset<br />IDictionaryEnumerator<br />Entry<br />Key<br />Value<br />
  8. 8. Operativa básica del Framework .NET<br />Globalización y localización<br />En el mundo actual es imprescindible que nuestras aplicaciones sean accesibles y se puedan adaptar a las peculiaridades de idioma y cultura de todos nuestros clientes.<br />Los términos asociados a estas funcionalidades multiculturales son los siguientes:<br />Véase “CultureInfo Class” en <br />http://msdn.microsoft.com/en-us/library/system.globalization.cultureinfo(VS.80).aspx<br />
  9. 9. Operativa básica del Framework .NET<br />Principales clases del espacio de nombres System.Globalization<br />
  10. 10. Operativa básica del Framework .NET<br />CultureInfo class<br />[Visual C#]<br />private void mostrarCulturas()<br />{<br />CultureInfo[] culturas =<br />CultureInfo.GetCultures(CultureTypes.SpecificCultures);<br />foreach (CultureInfo cultura in culturas)<br />{<br />Console.WriteLine(cultura.Name & “, “ & cultura.DisplayName);<br />}<br />}<br />[Visual Basic]<br />Private Sub mostrarCulturas()<br />Dim culturas As CultureInfo() = _<br />CultureInfo.GetCultures(CultureTypes.SpecificCultures)<br />For Each cultura As CultureInfo In culturas<br />Console.WriteLine(cultura.Name & “, “ & cultura.DisplayName)<br />Next culture<br />End Sub<br />Ejercicio<br />
  11. 11. Operativa básica del Framework .NET<br />Formatos de fecha<br />[Visual C#]<br />private void formatoFechas()<br />{<br />DateTimeFormatInfo formatoFecha1 = new CultureInfo("en-US", false).DateTimeFormat;<br />DateTimeFormatInfo formatoFecha2 = Thread.CurrentThread.CurrentCulture.DateTimeFormat;<br />Console.WriteLine("Formato de fecha 1: {0}", formatoFecha1.ShortDatePattern);<br />Console.WriteLine(" Formato de fecha 2: {0}", formatoFecha2.ShortDatePattern);<br />formatoFecha1.AbbreviatedMonthNames = new string[] {"Jn", "Fb", "Mr", "Ap", "My", "Jn", "Jy", "Au", "Se", "Oc", "Nv", "De", ""};<br />string hoy = DateTime.Now.ToString("dd-MMM-yyyy", formatoFecha1);<br />Console.WriteLine("Ammended Date Format: {0}", hoy) ;<br />}<br />[Visual Basic]<br />Private Sub formatoFechas)<br />Dim formatoFecha1 As DateTimeFormatInfo = New CultureInfo("en-US", _<br />False).DateTimeFormat<br />Dim formatoFecha2 As DateTimeFormatInfo = _<br />Thread.CurrentThread.CurrentCulture.DateTimeFormat<br />Console.WriteLine(" Formato de fecha 1: {0}", formatoFecha1.ShortDatePattern)<br />Console.WriteLine(" Formato de fecha 2: {0}", formatoFecha2.ShortDatePattern)<br />formatoFecha1.AbbreviatedMonthNames = New String() {"Jn", "Fb", "Mr", "Ap", "My", "Jn",_<br />"Jy", "Au", "Se", "Oc", "Nv", "De", ""}<br />Dim hoyAs String = DateTime.Now.ToString("dd-MMM-yyyy", formatoFecha1)<br />Console.WriteLine("Ammended Date Format: {0}", hoy)<br />End Sub<br />Ejercicio<br />
  12. 12. Operativa básica del Framework .NET<br />Interoperabilidad<br />El framework .NET, mediante el CLR, provee un entorno de ejecución controlada de aplicaciones, sea cual sea el lenguaje en el que hayan sido desarrolladas, dentro de los de la plataforma .NET, a lo que se llama entorno manejadoy los programas que en el corren, código manejado.<br />Todos los componentes desarrollados con otras tecnologías, DLL’s, Component Object Model, llamadas a las API’s de Windows, y todo aquél código que no ofrezca un interfaz .NET, entrará en la categoría de código no manejado.<br />El Framework .NET nos ofrece varias formas de acceder a este código no manejado y poder integrarlo en nuestras soluciones, ya sea como llamadas a objetos externos o integrándolos en los ensamblados anteriormente comentados.<br />De tal forma que su uso será absolutamente transparente al usuario, quedando perfectamente integrado y siendo su gestión totalmente controlada, como la del resto de nuestros ensamblados, gozando de todas las ventajas y privilegios que nos ofrece el entorno .NET.<br />
  13. 13. Operativa básica del Framework .NET<br />El accceso o llamadas al código no manejado se pueden realizar mediante Platform Invoke o COM Interop. <br />En ambos casos Interop Marshaler será la herramienta encargada del paso de datos entre código manejado y no manejado, mediante el uso de los stacks manejado y no manejado.<br />Los ensamblados para Interop se pueden crear mediante Visual Studio o la herramienta de línea de comandos tlbimp.<br />57-06<br />57-06<br />tlbimp MyTypeLib.tlb /out:InteropAssembly.dll /keyfile:Keys.snk<br />
  14. 14. Operativa básica del Framework .NET<br />Hilos o Hebras<br />Toda ejecución que lancemos en el sistema lo hará bajo un hilo (Thread) principal, del que podrán partir otros hilos de ejecución, pudiendo sincronizarse las ejecuciones de los diversos hilos, para coordinar los procesos, estando todas las clases relacionadas en el espacio de nombres System.Threading. Estos hilos nos permiten el lanzamiento de ejecuciones asíncronas que evitan el bloqueo de la interfaz de usuario mientras el sistema está ocupado en otros accesos.<br />Los servicios Windows son procesos, sin interfaz de usuario, que corren en un contexto de seguridad diferente del que tenga el usuario activo, habitualmente lanzados de forma autónoma y automática en el arranque del sistema, tras haber sido debidamente instalados, debiendo usar el espacio de nombres System.ServiceProcess, en su creación.<br />Tanto los hilos como los servicios corren en unas unidades de aislamiento dentro de los procesos de .NET llamados Dominios de Aplicación, los cuales permiten las ejecuciones en paralelo, aisladas unas de otras, permitiendo, incluso, la ejecución concurrente de versiones distintas de los mismos procesos sin interferir unos con otros.<br />
  15. 15. Operativa básica del Framework .NET<br />Para dotar de cierto paralelismo a nuestras aplicaciones, no es necesario dividirlas en procesos completamente independientes.<br />Dentro de un proceso, podemos tener varias hebras ejecutándose concurrentemente. Con las hebras se gana algo de eficiencia, al resultar más eficientes tanto los cambios de contexto como la comunicación entre hebras. <br />No obstante, al compartir el mismo espacio de memoria, deberemos ser cuidadosos al acceder a recursos compartidos, para lo que tendremos que utilizar los mecanismos de sincronización que veremos más adelante.<br />En la plataforma .NET, las clases incluidas en el espacio de nombres System.Threading, junto con la palabra reservada lock en C# / SyncLock en VB, nos proporcionan toda la infraestructura necesaria para crear aplicaciones multihebra. <br />De hecho, todas las aplicaciones .NET son en realidad aplicaciones multihebra. El recolector de basura no es más que una hebra que se ejecuta concurrentemente con la hebra principal de la aplicación y va liberando la memoria que ya no se usa.<br />
  16. 16. Operativa básica del Framework .NET<br />Threads de Windows:<br />Son unidades de ejecución que permiten enfocar el desarrollo orientado a tareas.<br />Mejoran el rendimiento y la respuesta de las aplicaciones ligadas en operaciones de entrada y salida, aunque reducen el rendimiento de las aplicaciones con alto consumo de CPU.<br />Los componentes COM se integran con estos hilos.<br />Threads de .NET:<br />Son hilos lógicos, normalmente basados en hilos de Windows.<br />Todo el framework .NET ha sido desarrollado para tener en cuenta la programación basada en hilos.<br />Los hilos de .NET integran perfectamente los objetos COM.<br />Disponemos de la clase estática ThreadPool que nos permite utilizar hilos genéricos de trabajo, sin necesidad de definición en nuestro proceso, sólo ejecutando QueueUserWorkitem con un delegado WaitCallback.<br />Sean del tipo que sean, una vez lanzado un hilo, no se puede parar la ejecución del proceso.<br />
  17. 17. Operativa básica del Framework .NET<br />[Visual C#]<br />void CrearHilo() {<br />Thread t = new Thread(new ParameterizedThreadStart(ProcesoLanzado));<br />// El hilo .NET ha sido creado, pero el método no ha sido llamado.<br />t.Start(1000); // Ahora se lanza la ejecución en el nuevo hilo.<br />}<br />void ProcesoLanzado(object param) {<br />int contador = (int)param;<br />for (int x = 0; x < contador ; ++x) {<br />. . . .<br />}<br />}<br />[Visual Basic]<br />Sub CrearHilo()<br />Dim t As New Thread(New ParameterizedThreadStart(AddressOf ProcesoLanzado))<br />' El hilo .NET ha sido creado, pero el método no ha sido llamado.<br />t.Start(1000) ' Ahora se lanza la ejecución en el nuevo hilo.<br />End Sub<br />Sub ProcesoLanzado (ByVal param As Object)<br />Dim contador As Integer = CInt(param)<br />For x = 0 To contador<br />. . . .<br />Next<br />End Sub<br />
  18. 18. Operativa básica del Framework .NET<br />Métodos de la clase Thread<br />COM<br />Security<br />Localization<br />Thread State<br />Thread Local Storage<br />Domains and Contexts<br />Thread Control<br />CriticalRegions<br />Thread Affinity<br />GetApartmentState<br />SetApartmentState<br />CurrentPrincipal<br />ExecutionContext<br />Priority<br />CurrentCulture<br />ThreadState<br />AllocateDataSlot<br />GetData<br />SetData<br />CurrentContext<br />GetDomain<br />Abort<br />CurrentThread<br />Join<br />Interrupt<br />BeginCriticalRegion<br />EndCriticalRegion<br />EndThreadAffinity<br />BeginThreadAffinity<br />SetProcessorAffinity<br />ThreadState: Unstarted, Running, WaitSleepJoin, Stopped, and Aborted.<br />
  19. 19. Operativa básica del Framework .NET<br />Objetos de sincronización de hilos<br />BackgroundWorker<br />Un hilo puede apuntar a uno o más hilos que están esperando.<br />EventWaitHandle<br />Solo un hilo es propietario del objeto protegido por el mutex. <br />Mutex<br />Más de un hilo es propietario del objeto protegido por unsemaphore.<br />Semaphore<br />Provee un bloqueo para proteger código. <br />Usado por lock(C#) / SyncLock(VB).<br />Monitor<br />Solo un hilo puede escribir en los datos protegidos, el resto solo puede leer los datos.<br />ReaderWriterLock<br />
  20. 20. Operativa básica del Framework .NET<br />Un servicio Windows es un proceso sin interfaz de usuario que, habitualmente, suele ejecutarse con un entorno de seguridad que no corresponde al del usuario del equipo y que puede ser lanzado automáticamente en el arranque del equipo. También es posible indicar que, en caso de parada inesperada, el servicio re-arranque automáticamente.<br />La instalación y desinstalación de los servicios se realiza mediante el Software Configuration Manager, con lo que quedará inscrito en el registro del sistema. Esta herramienta es también la utilizada para arrancar, pausar o para los servicios, pasando mensajes numéricos de 32 bits al servicio.<br />Un servicio puede depender de otros para su ejecución.<br />Un proceso puede contener más de un servicio.<br />En el caso de requerir parámetros o valores de alguna aplicación, los servicios deberán dar soporte a la comunicación inter-procesos.<br />
  21. 21. Operativa básica del Framework .NET<br />Para generar un nuevo servicio deberemos heredar de la clase Sysyem.ServiceBase.ServiceBase y utilizar su método estático Run para registrar la función ServiceMain y los handlers asociados al servicio.<br />La inicialización del servicio deberá situarse en el método OnStart, en lugar de en el constructor.<br />Para poder acceder a los servicios registrados en el sistema deberemos utilizar la clase ServiceController, junto con el SCM, para poder pasarle comandos o mensajes IPC al servicio.<br />Aunque todo esto está bastante simplificado si desarrollamos nuestro servicio desde Visual Studio 2008, ya que disponemos de una plantilla de proyecto específica para generar servicios y sólo tendremos que ir implementando la funcionalidad que requiera nuestro servicio mediante el uso de los controles adecuados.<br />Habremos de generar un Installer, con el atributo RunInstaller a True, y una instancia de ServiceInstaller para cada servicio del proceso, el cual deberá tener una instancia de ServiceProcessInstaller.<br />

×