framework class library (fcl) dr. diego lz. de ipiña gz. de artaza

42
Framework Class Library (FCL) Dr. Diego Lz. de Ipiña Gz. de Artaza http://paginaspersonales.deusto. es/dipina

Upload: sabas-casares

Post on 28-Jan-2016

222 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Framework Class Library (FCL) Dr. Diego Lz. de Ipiña Gz. de Artaza

Framework Class Library (FCL)

Dr. Diego Lz. de Ipiña Gz. de Artazahttp://paginaspersonales.deusto.es/dipina

Page 2: Framework Class Library (FCL) Dr. Diego Lz. de Ipiña Gz. de Artaza

FCL (Framework Class Library)

Provee la API que las aplicaciones gestionadas en .NET invocan.

Incluye más de 7000 tipos y está particionada en más de 100 espacios de nombres :Desde Int32 y String a tipos como Regex o Form

System es la raíz de la mayoríaDefine tipos básicos como Int32 y Byte y clases

de utilidad como Math y TimeSpan o Collections

Page 3: Framework Class Library (FCL) Dr. Diego Lz. de Ipiña Gz. de Artaza

FCL (Framework Class Library)

En este apartado veremos algunas de los espacios de nombres más importantes de la FCL:System.IOSystem.CollectionsSystem.XMLSystem.ReflectionSystem.GCSystem.NET y System.Web

Page 4: Framework Class Library (FCL) Dr. Diego Lz. de Ipiña Gz. de Artaza

System.IO Este espacio de nombres lo comprenden las clases

que facilitan el acceso a ficheros. La construcción principal que usan es el stream Clases de tipo Stream, como FileStream, son

básicas .NET también provee construcciones más sofisticadas en

forma de Readers y Writers

Permite acceder tanto a ficheros de texto (a través de TextWriter y TextReader) como a binarios (BinaryWriter y BinaryReader).

Page 5: Framework Class Library (FCL) Dr. Diego Lz. de Ipiña Gz. de Artaza

System.IO El procedimiento para leer o escribir un fichero es:

1. Abrir el fichero usando el objeto FileStream2. Para lecturas o escrituras binarias, crear un BinaryReader y

BinaryWriter alrededor de FileStream, y llamar a métodos Read y Write

3. Para lecturas o escrituras de texto, crear un StreamReader y StreamWriter alrededor de FileStream, y llamar a métodos ReadLine y WriteLine

4. Cerrar el FileStream

System.IO contiene también clases para manipular ficheros y directorios:

File y FileInfo, abre, crea, copia, mueve y borra ficheros Directory y DirectoryInfo hacen lo mismo para directorios

Page 6: Framework Class Library (FCL) Dr. Diego Lz. de Ipiña Gz. de Artaza

Ejemplo de I/O para texto: List.cs

// compilar: csc List.cs// ejecutar: List <fichero-a-ver>// descripción: emulado comando TYPE de DOSusing System;using System.IO;class List { static void Main (string[] args){ // Verificar que se ha recibido nombre fichero if (args.Length == 0) { Console.WriteLine ("Error: Fichero no encontrado"); return; } // Abre el fichero y visualiza contenido StreamReader reader = null;

Page 7: Framework Class Library (FCL) Dr. Diego Lz. de Ipiña Gz. de Artaza

Ejemplo de I/O para texto: List.cs try { reader = new StreamReader (args[0]); for (string line = reader.ReadLine (); line != null; line = reader.ReadLine ()) Console.WriteLine (line); } catch (IOException e) { Console.WriteLine (e.Message); } finally { if (reader != null) reader.Close (); } }}

Page 8: Framework Class Library (FCL) Dr. Diego Lz. de Ipiña Gz. de Artaza

// compilar: csc Scramble.cs// ejecutar: Scramble <nombre-fichero> <clave>// descripción: encripta un fichero con la clave pasada, // para desencriptar ejecutar el comando de nuevousing System;using System.IO;using System.Text;class Scramble { const int bufsize = 1024; static void Main (string[] args) { // Make sure a file name and encryption key were entered if (args.Length < 2) { Console.WriteLine (“Sintaxis: SCRAMBLE nombre-fichero clave"); return; }

Ejemplo de I/O binario: Scramble.cs

Page 9: Framework Class Library (FCL) Dr. Diego Lz. de Ipiña Gz. de Artaza

Ejemplo de I/O binario: Scramble.cs string filename = args[0]; string key = args[1]; FileStream stream = null; try { // Abre el fichero para escritura/lectura stream = File.Open (filename, FileMode.Open, FileAccess.ReadWrite);

// Crea un FileStream alrededor del reader y writer BinaryReader reader = new BinaryReader (stream); BinaryWriter writer = new BinaryWriter (stream); // Convierte la clave pasada en un array de bytes ASCIIEncoding enc = new ASCIIEncoding (); byte[] keybytes = enc.GetBytes (key);

Page 10: Framework Class Library (FCL) Dr. Diego Lz. de Ipiña Gz. de Artaza

// Asignar un bufer de entrada y otro para la clave byte[] buffer = new byte[bufsize]; byte[] keybuf = new byte[bufsize + keybytes.Length - 1]; // Hacer que el tamaño de la clave sea el del bufer I/O int count = (1024 + keybytes.Length - 1) / keybytes.Length; for (int i=0; i<count; i++) Array.Copy (keybytes, 0, keybuf, i * keybytes.Length, keybytes.Length); // Leer fichero en bloques de bufsize y aplicar XOR // y escribir el fichero de vuelta long lBytesRemaining = stream.Length; while (lBytesRemaining > 0) { long lPosition = stream.Position; int nBytesRequested = (int) System.Math.Min (bufsize, lBytesRemaining);

Ejemplo de I/O binario: Scramble.cs

Page 11: Framework Class Library (FCL) Dr. Diego Lz. de Ipiña Gz. de Artaza

int nBytesRead = reader.Read (buffer, 0, nBytesRequested); for (int i=0; i<nBytesRead; i++) buffer[i] ^= keybuf[i]; stream.Seek (lPosition, SeekOrigin.Begin); writer.Write (buffer, 0, nBytesRead); lBytesRemaining -= nBytesRead; } } catch (Exception e) { Console.WriteLine (e.Message); } finally { if (stream != null) stream.Close (); } }}

Ejemplo de I/O binario: Scramble.cs

Page 12: Framework Class Library (FCL) Dr. Diego Lz. de Ipiña Gz. de Artaza

Colecciones

La plataforma .NET tiene un espacio de nombres dedicado a estructuras de datos como pilas, arrays dinámicos, colas...

System.Collections dispone de una serie de interfaces que implementan todas estas colecciones.

Page 13: Framework Class Library (FCL) Dr. Diego Lz. de Ipiña Gz. de Artaza

Colecciones

Entre otras estructuras podemos encontrar:ArrayList: Array dinámico.HashTable: Tablas de Hashing.Queue: Colas.SortedList: Listas ordenadas.Stack: Pilas.BitArray: array de bits (guardan booleanos)

Todas las colecciones menos BitArray guardan objetos de tipo System.Object

Page 14: Framework Class Library (FCL) Dr. Diego Lz. de Ipiña Gz. de Artaza

// ejecutar: WordCount <fichero-en-que-contar-palabras>using System;using System.IO;using System.Collections;class WordCount { static void Main (string[] args){ // Validar si se ha introducido un nombre fichero if (args.Length == 0) { Console.WriteLine ("Error: Missing file name"); return; } StreamReader reader = null; Hashtable table = new Hashtable (); // crear mapa

Ejemplo WordCount

Page 15: Framework Class Library (FCL) Dr. Diego Lz. de Ipiña Gz. de Artaza

try { // Moverse palabra a palabra por el fichero // manteniendo un contador por cada palabra reader = new StreamReader (args[0]); for (string line = reader.ReadLine (); line != null; line = reader.ReadLine ()) { string[] words = GetWords (line); foreach (string word in words) { string iword = word.ToLower (); if (table.ContainsKey (iword)) table[iword] = (int) table[iword] + 1; else table[iword] = 1; // crear entrada } }

Ejemplo WordCount

Page 16: Framework Class Library (FCL) Dr. Diego Lz. de Ipiña Gz. de Artaza

// Ordenar entradas tabla con SortedList SortedList list = new SortedList (table); // Visualiza los resultados Console.WriteLine ("{0} palabras únicas en {1}", table.Count, args[0]);

foreach (DictionaryEntry entry in list) Console.WriteLine ("{0} ({1})", entry.Key, entry.Value); } catch (Exception e) { Console.WriteLine (e.Message); } finally { if (reader != null) reader.Close (); } }

Ejemplo WordCount

Page 17: Framework Class Library (FCL) Dr. Diego Lz. de Ipiña Gz. de Artaza

static string[] GetWords (string line) { // Crear un array para guardar resultados intermedios ArrayList al = new ArrayList (); // Añadir palabras desde line a al int i = 0; string word; char[] characters = line.ToCharArray (); while ((word = GetNextWord (line, characters, ref i)) != null) al.Add (word); // Return a static array that is equivalent to the ArrayList string[] words = new string[al.Count]; al.CopyTo (words); return words; }

Ejemplo WordCount

Page 18: Framework Class Library (FCL) Dr. Diego Lz. de Ipiña Gz. de Artaza

static string GetNextWord (string line, char[] characters, ref int i) { // Encontrar comienzo de palabra while (i < characters.Length && !Char.IsLetterOrDigit (characters[i])) i++; if (i == characters.Length) return null; int start = i; // Find the end of the word while (i < characters.Length && Char.IsLetterOrDigit (characters[i])) i++; // Return the word return line.Substring (start, i - start); }}

Ejemplo WordCount

Page 19: Framework Class Library (FCL) Dr. Diego Lz. de Ipiña Gz. de Artaza

System.XML

Este espacio de nombres comprende todas las clases necesarias para manejar documentos Xml.

Permite leer o parsear un documento, así como escribir un documento Xml.

Para ello necesitaremos conocer previamente la estructura de un documento Xml.

Page 20: Framework Class Library (FCL) Dr. Diego Lz. de Ipiña Gz. de Artaza

System.XML Este espacio de nombres provee soporte para los

estándares de procesamiento XML: XML 1.0 - http://www.w3.org/TR/1998/REC-xml-19980210 -

including DTD support. XML Namespaces - http://www.w3.org/TR/REC-xml-names/ -

both stream level and DOM. XSD Schemas - http://www.w3.org/2001/XMLSchema XPath expressions - http://www.w3.org/TR/xpath XSLT transformations - http://www.w3.org/TR/xslt DOM Level 1 Core - http://www.w3.org/TR/REC-DOM-Level-

1/ DOM Level 2 Core - http://www.w3.org/TR/DOM-Level-2/

Page 21: Framework Class Library (FCL) Dr. Diego Lz. de Ipiña Gz. de Artaza

Un poco de XMLLenguaje mundial de facto para intercambio

de datosXML no tiene tanto éxito porque es un gran

lenguaje, sino porque las herramientas disponibles para leer, escribir y manipular XML son muy comunes

Casi todos los parseadores de XML implementan una de dos APIs:DOM: lee un documento en memoria y lo carga en

un árbolSAX: API basada en eventos

Page 22: Framework Class Library (FCL) Dr. Diego Lz. de Ipiña Gz. de Artaza

Ejemplo DOM en .NET<?xml version=“1.0”?><Guitars> <Guitar Image=“MySG.jpeg”> <Make>Gibson</Make> <Model>SG</Model> <Year>1977</Year> <Color>Tobacco Sunburst</Color> <Neck>Rosewood</Neck> </Guitar> <Guitar Image=“MyStrat.jpeg”> <Make>Fender</Make> <Model>Stratocaster</Model> <Year>1990</Year> <Color>Black</Color> <Neck>Maple</Neck> </Guitar></Guitars>

Page 23: Framework Class Library (FCL) Dr. Diego Lz. de Ipiña Gz. de Artaza

Ejemplo DOM en .NETusing System;using System.Xml;

class MyApp{ static void Main () { XmlDocument doc = new XmlDocument (); doc.Load ("Guitars.xml"); XmlNodeList nodes = doc.GetElementsByTagName

("Guitar"); foreach (XmlNode node in nodes) { Console.WriteLine ("{0} {1}",

node["Make"].InnerText, node["Model"].InnerText); } }}

Page 24: Framework Class Library (FCL) Dr. Diego Lz. de Ipiña Gz. de Artaza

XmlDocument Interfaz programática para XML documents

que conforman con la especificación DOM Método Load(nombre-doc) procesa el

documento y construye un árbol del mismo Una llamada exitosa es normalmente seguida

de invocación a propiedad DocumentElement Para saber si tiene hijos usar propiedad HasChildNodes

Propiedad ChildNodes devuelve los hijos de un nodo Todo hijo es un XMLNode que puede ser del tipo Element, Text, Attribute, etc.

Page 25: Framework Class Library (FCL) Dr. Diego Lz. de Ipiña Gz. de Artaza

XmlTextReader

Frente al estándar SAX, .NET ofrece XmlTextReader

Está basado en streams como SAX y es por tanto más eficiente con el uso de memoria que DOM

Usa un mecanismo pull para examinar Xml en vez de push como SAX

Page 26: Framework Class Library (FCL) Dr. Diego Lz. de Ipiña Gz. de Artaza

Ejemplo XmlTextReader I Lee un fichero XML y visualiza todos sus nodos

<?xml version="1.0"?><!-- This is a sample XML document --><!DOCTYPE Items [<!ENTITY number "123">]><Items> <Item>Test with an entity: &number;</Item> <Item>test with a child element <more/> stuff</Item> <Item>test with a CDATA section <![CDATA[<456>]]>

def</Item> <Item>Test with an char entity: &#65;</Item> <!-- Fourteen chars in this element.--> <Item>1234567890ABCD</Item></Items>

Page 27: Framework Class Library (FCL) Dr. Diego Lz. de Ipiña Gz. de Artaza

Ejemplo XmlTextReader IIpublic class Sample { private const String filename = "items.xml"; public static void Main() { XmlTextReader reader = null; try { // Cargar reader con fichero XML ignorando espacios. reader = new XmlTextReader(filename); reader.WhitespaceHandling = WhitespaceHandling.None; // Procesar fichero y visualizar cada nodo while (reader.Read()) { switch (reader.NodeType) { case XmlNodeType.Element: Console.Write("<{0}>", reader.Name); break; case XmlNodeType.Text: Console.Write(reader.Value); break; case XmlNodeType.CDATA: Console.Write("<![CDATA[{0}]]>", reader.Value); break;

Page 28: Framework Class Library (FCL) Dr. Diego Lz. de Ipiña Gz. de Artaza

Ejemplo XmlTextReader III

case XmlNodeType.ProcessingInstruction: Console.Write("<?{0} {1}?>", reader.Name,

reader.Value); break; case XmlNodeType.Comment: Console.Write("<!--{0}-->", reader.Value); break; case XmlNodeType.XmlDeclaration: Console.Write("<?xml version='1.0'?>"); break; case XmlNodeType.Document: break; case XmlNodeType.DocumentType: Console.Write("<!DOCTYPE {0} [{1}]",

reader.Name, reader.Value); break;

Page 29: Framework Class Library (FCL) Dr. Diego Lz. de Ipiña Gz. de Artaza

Ejemplo XmlTextReader IV

case XmlNodeType.EntityReference: Console.Write(reader.Name); break; case XmlNodeType.EndElement: Console.Write("</{0}>", reader.Name); break; } } } finally { if (reader!=null) reader.Close(); } }} // Final clase

Page 30: Framework Class Library (FCL) Dr. Diego Lz. de Ipiña Gz. de Artaza

Transformaciones XSLT XSLT (Extensible Stylesheet Language

Transformations) es un lenguaje para convertir documentos XML de un formato en otro

Tiene dos usos principales: Convertir documentos XML en HTML Convertir documentos XML en otros

documentos XMLEste tipo de conversiones son el núcleo de

aplicaciones middleware como Microsoft BizTalk Server.

Page 31: Framework Class Library (FCL) Dr. Diego Lz. de Ipiña Gz. de Artaza

Ejemplo transformación XSLT

using System;using System.Xml;using System.Xml.XPath;using System.Xml.Xsl;class MyApp { static void Main (string[] args) {

if (args.Length < 2) { Console.WriteLine ("Syntax: TRANSFORM xmldoc xsldoc"); return; } try { XslTransform xsl = new XslTransform (); xsl.Load (args[1]);

Page 32: Framework Class Library (FCL) Dr. Diego Lz. de Ipiña Gz. de Artaza

Ejemplo transformación XSLT

//Crear un nuevo XPathDocument y cargar el fichero XML a transformar

XPathDocument doc = new XPathDocument (args[0]); //Crear un XmlTextWriter que escribe a consola. XmlWriter writer = new XmlTextWriter(Console.Out); xsl.Transform (doc, null, writer, null); } catch (Exception ex) { Console.WriteLine (ex.Message); }

}}

Page 33: Framework Class Library (FCL) Dr. Diego Lz. de Ipiña Gz. de Artaza

System.Reflection

Este espacio de nombres proporciona clases para:Conseguir todos los tipos de datos que hay

en un ensamblado (System.Reflection.Assembly).

Listar los miembros de esos tipos de datos (System.Reflection.Module y System.Type).

Invocar métodos dinámicamente.

Page 34: Framework Class Library (FCL) Dr. Diego Lz. de Ipiña Gz. de Artaza

Ejemplo System.Reflection// fichero : reflect.cs// compilar : csc reflect.cs

using System;using System.Reflection;using System.Text.RegularExpressions;

public class Persona {

public Persona(string nombre, string apellido1) { Nombre = nombre; Apellido1 = apellido1; }

Page 35: Framework Class Library (FCL) Dr. Diego Lz. de Ipiña Gz. de Artaza

Ejemplo System.Reflection public void VerNombre() { Console.WriteLine(“Nombre={0}", Nombre); } public void VerApellido1() { Console.WriteLine(“Apellido1={0}", Apellido1); } public void VerTodos() { Console.WriteLine("Persona..."); Console.WriteLine(“Nombre={0}", Nombre); Console.WriteLine(“Apellido1={0}", Apellido1); } public readonly string Nombre; public readonly string Apellido1;}

Page 36: Framework Class Library (FCL) Dr. Diego Lz. de Ipiña Gz. de Artaza

Ejemplo System.Reflectionpublic class Reflect { public static void Main() { // recuperar tipo Persona ... Type typ = Type.GetType(“Persona"); // crear array con args constructor... object[] args = {“Diego", “Ipiña"}; // crear una instancia de Persona ... Object obj = Activator.CreateInstance(typ, args); // conseguir lista métodos Persona ... MethodInfo[] met = typ.GetMethods();

Page 37: Framework Class Library (FCL) Dr. Diego Lz. de Ipiña Gz. de Artaza

Ejemplo System.Reflection // encontrar e invocar todos los métodos ver... Regex r = new Regex("^ver", RegexOptions.IgnoreCase); foreach (MethodInfo m in met) if (r.IsMatch(m.Name)) m.Invoke(obj, null); // invocar método ver }}

Page 38: Framework Class Library (FCL) Dr. Diego Lz. de Ipiña Gz. de Artaza

System.GCEsta clase representa al recolector de

basura que maneja el CLR de la plataforma.

Implementa una serie de métodos que nos permiten:Forzar la recolección de basura.Evitar que se ejecute el destructor de un

objeto determinado.

Page 39: Framework Class Library (FCL) Dr. Diego Lz. de Ipiña Gz. de Artaza

System.Web y System.Net

System.Net provee clases para llevar a cabo tareas relacionadas con Internet

System.Net.Sockets permite la comunicación a través de Sockets

System.Web, System.Web.Mail y System.Web.Services, están construidas encima de System.Net

Page 40: Framework Class Library (FCL) Dr. Diego Lz. de Ipiña Gz. de Artaza

Listando enlaces de página web

using System;using System.IO;using System.Net;using System.Text.RegularExpressions;class ListLink { static void Main (string[] args) { if (args.Length == 0) { Console.WriteLine ("Error: Indica URL para listar enlaces"); return; } StreamReader reader = null; try { WebRequest request = WebRequest.Create (args[0]); WebResponse response = request.GetResponse ();

Page 41: Framework Class Library (FCL) Dr. Diego Lz. de Ipiña Gz. de Artaza

Listando enlaces de página web

reader = new StreamReader (response.GetResponseStream ()); string content = reader.ReadToEnd (); Regex regex = new Regex ("href\\s*=\\s*\"([^\"]*)\"", RegexOptions.IgnoreCase); MatchCollection matches = regex.Matches (content); foreach (Match match in matches) Console.WriteLine (match.Groups[1]); } catch (Exception e) { Console.WriteLine (e.Message); } finally { if (reader != null) reader.Close (); } }}

Page 42: Framework Class Library (FCL) Dr. Diego Lz. de Ipiña Gz. de Artaza

Enviando un mail con .NETusing System.Web.Mail;…MailMessage message = new MailMessage ();message.From = Sender.Text; message.To = Receiver.Text; message.Subject = Subject.Text; message.Body = Body.Text; SmtpMail.SmtpServer = "localhost"; SmtpMail.Send (message);