Framework Class Library (FCL) Dr. Diego Lz. de Ipiña Gz. de Artaza http://paginaspersonales.deusto.es/dipina.
Download
Report
Transcript Framework Class Library (FCL) Dr. Diego Lz. de Ipiña Gz. de Artaza http://paginaspersonales.deusto.es/dipina.
Framework Class Library (FCL)
Dr. Diego Lz. de Ipiña Gz. de Artaza
http://paginaspersonales.deusto.es/dipina
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ía
Define tipos básicos como Int32 y Byte y clases
de utilidad como Math y TimeSpan o
Collections
FCL (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
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).
System.IO
El procedimiento para leer o escribir un fichero es:
1.
2.
3.
4.
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
Ejemplo de I/O para texto: List.cs
// compilar: csc List.cs
// ejecutar: List <fichero-a-ver>
// 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;
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 ();
}
}
}
Ejemplo de I/O binario: Scramble.cs
// compilar: csc Scramble.cs
// ejecutar: Scramble <nombre-fichero> <clave>
// 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 < 2) {
Console.WriteLine (“Sintaxis: SCRAMBLE nombre-fichero
clave");
return;
}
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);
Ejemplo de I/O binario: Scramble.cs
// 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
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 ();
}
}
}
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.
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
Ejemplo WordCount
// 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
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
// 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
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
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);
}
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.
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/
Un 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
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>
Ejemplo DOM en .NET
using 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);
}
}
}
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.
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
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: A</Item>
<!-- Fourteen chars in this element.-->
<Item>1234567890ABCD</Item>
</Items>
Ejemplo 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("<{0}>", reader.Name);
break;
case XmlNodeType.Text:
Console.Write(reader.Value);
break;
case XmlNodeType.CDATA:
Console.Write("<![CDATA[{0}]]>", reader.Value);
break;
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;
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
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
XML
Este tipo de conversiones son el núcleo de aplicaciones
middleware como Microsoft BizTalk Server.
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]);
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);
}
}
}
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.
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;
}
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;
}
Ejemplo 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.CreateInstance(typ, args);
// conseguir lista métodos Persona ...
MethodInfo[] met = typ.GetMethods();
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
}
}
System.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.
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
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 ();
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 ();
}
}
}
Enviando 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);