Title: Framework Class Library (FCL)
1Framework Class Library (FCL)
- Dr. Diego Lz. de Ipiña Gz. de Artaza
- http//paginaspersonales.deusto.es/dipina
2FCL (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Ãa
- Define tipos básicos como Int32 y Byte y clases
de utilidad como Math y TimeSpan o Collections
3FCL (Framework Class Library)
- En este apartado veremos algunas de los espacios
de nombres más importantes de la FCL - System.IO
- System.Collections
- System.XML
- System.Reflection
- System.GC
- System.NET y System.Web
4System.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).
5System.IO
- El procedimiento para leer o escribir un fichero
es - Abrir el fichero usando el objeto FileStream
- Para lecturas o escrituras binarias, crear un
BinaryReader y BinaryWriter alrededor de
FileStream, y llamar a métodos Read y Write - Para lecturas o escrituras de texto, crear un
StreamReader y StreamWriter alrededor de
FileStream, y llamar a métodos ReadLine y
WriteLine - 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
6Ejemplo de I/O para texto List.cs
// compilar csc List.cs // ejecutar List
ltfichero-a-vergt // descripción emulado comando
TYPE de DOS using 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
7Ejemplo de I/O para texto List.cs
try reader new StreamReader
(args0) 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
()
8Ejemplo de I/O binario Scramble.cs
// compilar csc Scramble.cs // ejecutar
Scramble ltnombre-ficherogt ltclavegt // descripción
encripta un fichero con la clave pasada, // para
desencriptar ejecutar el comando de nuevo using
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 lt 2)
Console.WriteLine (Sintaxis SCRAMBLE
nombre-fichero clave") return
9Ejemplo de I/O binario Scramble.cs
string filename args0 string
key args1 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)
10Ejemplo de I/O binario Scramble.cs
// Asignar un bufer de entrada y otro
para la clave byte buffer new
bytebufsize byte keybuf new
bytebufsize 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 i0
iltcount 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 gt 0) long lPosition
stream.Position int nBytesRequested
(int) System.Math.Min (bufsize,
lBytesRemaining)
11Ejemplo de I/O binario Scramble.cs
int nBytesRead reader.Read
(buffer, 0,
nBytesRequested) for (int i0
iltnBytesRead i) bufferi
keybufi 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 ()
12Colecciones
- 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.
13Colecciones
- 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
14Ejemplo WordCount
// ejecutar WordCount ltfichero-en-que-contar-pala
brasgt 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
15Ejemplo WordCount
try // Moverse palabra a
palabra por el fichero // manteniendo
un contador por cada palabra reader
new StreamReader (args0) 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))
tableiword (int)
tableiword 1 else
tableiword 1 // crear
entrada
16Ejemplo WordCount
// Ordenar entradas tabla con
SortedList SortedList list new
SortedList (table) // Visualiza los
resultados Console.WriteLine ("0
palabras únicas en 1",
table.Count, args0) 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
()
17Ejemplo WordCount
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
stringal.Count al.CopyTo (words)
return words
18Ejemplo WordCount
static string GetNextWord (string line,
char characters, ref int i)
// Encontrar comienzo de palabra while (i
lt characters.Length
!Char.IsLetterOrDigit (charactersi))
i if (i characters.Length)
return null int start i
// Find the end of the word while (i lt
characters.Length
Char.IsLetterOrDigit (charactersi))
i // Return the word return
line.Substring (start, i - start)
19System.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.
20System.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-199802
10 - including DTD support. - XML Namespaces - http//www.w3.org/TR/REC-xml-name
s/ - 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-Le
vel-1/ - DOM Level 2 Core - http//www.w3.org/TR/DOM-Level-
2/
21Un poco de XML
- Lenguaje mundial de facto para intercambio de
datos - XML 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
árbol - SAX API basada en eventos
22Ejemplo DOM en .NET
- lt?xml version1.0?gt
- ltGuitarsgt
- ltGuitar ImageMySG.jpeggt
- ltMakegtGibsonlt/Makegt
- ltModelgtSGlt/Modelgt
- ltYeargt1977lt/Yeargt
- ltColorgtTobacco Sunburstlt/Colorgt
- ltNeckgtRosewoodlt/Neckgt
- lt/Guitargt
- ltGuitar ImageMyStrat.jpeggt
- ltMakegtFenderlt/Makegt
- ltModelgtStratocasterlt/Modelgt
- ltYeargt1990lt/Yeargt
- ltColorgtBlacklt/Colorgt
- ltNeckgtMaplelt/Neckgt
- lt/Guitargt
- lt/Guitarsgt
23Ejemplo DOM en .NET
- using System
- using System.Xml
- class MyApp
-
- static void Main ()
-
- XmlDocument doc new XmlDocument ()
- doc.Load ("Guitars.xml")
- XmlNodeList nodes doc.GetElementsByTagNa
me ("Guitar") - foreach (XmlNode node in nodes)
- Console.WriteLine ("0 1",
node"Make".InnerText, - node"Model".InnerText)
-
-
24XmlDocument
- 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.
25XmlTextReader
- 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
26Ejemplo XmlTextReader I
- Lee un fichero XML y visualiza todos sus nodos
- lt?xml version"1.0"?gt
- lt!-- This is a sample XML document --gt
- lt!DOCTYPE Items lt!ENTITY number "123"gtgt
- ltItemsgt
- ltItemgtTest with an entity numberlt/Itemgt
- ltItemgttest with a child element ltmore/gt
stufflt/Itemgt - ltItemgttest with a CDATA section
lt!CDATAlt456gtgt deflt/Itemgt - ltItemgtTest with an char entity 65lt/Itemgt
- lt!-- Fourteen chars in this element.--gt
- ltItemgt1234567890ABCDlt/Itemgt
- lt/Itemsgt
27Ejemplo XmlTextReader II
- public 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("lt0gt",
reader.Name) - break
- case XmlNodeType.Text
- Console.Write(reader.Value)
- break
- case XmlNodeType.CDATA
- Console.Write("lt!CDATA0gt",
reader.Value)
28Ejemplo XmlTextReader III
- case XmlNodeType.ProcessingInstructio
n - Console.Write("lt?0 1?gt",
reader.Name, reader.Value) - break
- case XmlNodeType.Comment
- Console.Write("lt!--0--gt",
reader.Value) - break
- case XmlNodeType.XmlDeclaration
- Console.Write("lt?xml
version'1.0'?gt") - break
- case XmlNodeType.Document
- break
- case XmlNodeType.DocumentType
- Console.Write("lt!DOCTYPE 0
1", reader.Name, reader.Value) - break
-
29Ejemplo XmlTextReader IV
- case XmlNodeType.EntityReference
- Console.Write(reader.Name)
- break
- case XmlNodeType.EndElement
- Console.Write("lt/0gt",
reader.Name) - break
-
-
-
- finally
- if (reader!null)
- reader.Close()
-
-
- // Final clase
30Transformaciones 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 XML
- Este tipo de conversiones son el núcleo de
aplicaciones middleware como Microsoft BizTalk
Server.
31Ejemplo 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 lt 2)
- Console.WriteLine ("Syntax TRANSFORM
xmldoc xsldoc") - return
-
- try
- XslTransform xsl new XslTransform ()
- xsl.Load (args1)
-
32Ejemplo transformación XSLT
- //Crear un nuevo XPathDocument y cargar el
fichero XML a transformar - XPathDocument doc new XPathDocument
(args0) - //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)
-
-
-
33System.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.
34Ejemplo System.Reflection
// fichero reflect.cs // compilar csc
reflect.cs using System using
System.Reflection using System.Text.RegularExpres
sions public class Persona public
Persona(string nombre, string apellido1)
Nombre nombre Apellido1 apellido1
35Ejemplo System.Reflection
public void VerNombre()
Console.WriteLine(Nombre0", Nombre)
public void VerApellido1()
Console.WriteLine(Apellido10", Apellido1)
public void VerTodos()
Console.WriteLine("Persona...")
Console.WriteLine(Nombre0", Nombre)
Console.WriteLine(Apellido10", Apellido1)
public readonly string Nombre public
readonly string Apellido1
36Ejemplo System.Reflection
public 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.CreateInsta
nce(typ, args) // conseguir lista métodos
Persona ... MethodInfo met
typ.GetMethods()
37Ejemplo 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
38System.GC
- Esta 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.
39System.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
40Listando 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
(args0) WebResponse response
request.GetResponse ()
41Listando 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.Groups1) catch (Exception e)
Console.WriteLine (e.Message)
finally if (reader ! null)
reader.Close ()
42Enviando un mail con .NET
using 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)