You are on page 1of 31

Marco Besteiro y Miguel Rodrguez Introduccin a C#

1/31

Introduccin a la programacin con C#.

El programa bsico, Hola Mundo .
El siguiente programa es la versin C#que muestra la cadena Hola Mundo por
consola.

/ / Pr ogr ama C# que muest r a Hol a Mundo por consol a.
/ / Est as dos l neas son dos coment ar i os en C#

cl ass Hol a
{
publ i c st at i c voi d Mai n( )
{
/ * Wr i t eLi ne es un mt odo de l a cl ase Consol e,
l a cual se encuent r a en el namespace Syst em.
Est as l neas son t ambi en un coment ar i o*/
Syst em. Consol e. Wr i t eLi ne( " Hol a Mundo" ) ;
}
}

Almacene este cdigo en un fichero denominado Hol a. cs.

Antes de proceder a compilar este fichero, es conveniente hacer algunos comentarios
generales que irn ayudando a comprender mejor este simple programa.

a) En C#todo el cdigo debe estar situado dentro de una o varias clases. Este
primer programa tiene una nica clase Hol a- que a su vez contiene un nico
mtodo Mai n( ) -. Un mtodo no es ms que un conjunto de instrucciones que
sern ejecutadas cada vez que el mtodo sea invocado.
b) El fichero de cdigo fuente puede llamarse con el mismo nombre que la clase
que contiene el mtodo Mai n( ) -como sucede en J ava- o con otro distinto. En
este libro muchas veces se har as. Los ficheros fuente tienen la extensin .cs
de C Sharp-.
c) Mai n( ) se escribe con maysculas. C#es sensible a las maysculas.
d) El mtodo Mai n( ) es un miembro de la clase Hol a, y es especialmente
importante porque es el punto de entrada del programa, el mtodo que se ejecuta
en primer lugar. Tiene tres palabras que le preceden:
a. voi d indica que este mtodo no devuelve nada. La palabra
inmediatamente anterior a un mtodo, indica el tipo de dato que devuelve
el mtodo Mai n( ) .
b. publ i c: con este modificador se indica que este mtodo es pblico y que
por lo tanto puede ser llamado desde el cdigo de cualquier clase. En C#
-al contrario de lo que sucede en J ava- cuando se omite este modificador,
el mtodo es privado, que significa que dicho mtodo slo puede ser
llamado por el cdigo de la propia clase en la que est definido el
mtodo.
c. st at i c: indica que Mai n( ) es un mtodo de clase o esttico, es decir,
que puede ser invocado sin necesidad de crear un objeto de la clase Hol a.
Realmente, cuando se ejecuta el programa, el compilador, en primer
Marco Besteiro y Miguel Rodrguez Introduccin a C#
2/31
lugar, llama al mtodo Mai n( ) de la clase Hol a sin haber creado ningn
objeto de esta clase.

El mtodo Mai n( ) simplemente ejecuta la lnea:

Syst em. Consol e. Wr i t eLi ne( " Hol a Mundo" ) ;

Esta lnea imprime en pantalla la cadena Hol a Mundo.

La librera de .NET tiene definidas muchas clases que el programador puede utilizar.
Una de ellas es la clase Consol e que proporciona algunos mtodos de entrada/salida por
consola. Uno de los mtodos de salida de la clase Consol e es el mtodo Wr i t eLi ne( ) .
Wr i t eLi ne( ) es un mtodo esttico y por eso se invoca a travs del nombre de la clase.
El mtodo Wr i t eLi ne( ) muestra por la consola o lnea de comandos la cadena que se le
pasa como parmetro, aadiendo un salto de lnea y un retorno de carro. Si se desea no
aadir el salto de lnea ni el retorno de carro se puede utilizar otro mtodo de la clase
Consol e denominado Wr i t e( ) .

Syst emes el namespace el mbito, el espacio de nombres- de la librera donde se
encuentra la clase Consol e. Para no tener que escribir Syst em. Consol e cada vez que
se desee llamar a esta clase, se puede importar el espacio de nombres Syst emen nuestra
aplicacin, con la directiva usi ng:

/ / Est e pr ogr ama t i ene l a mi sma sal i da que el ant er i or
usi ng Syst em;
cl ass SegundoHol a
{
publ i c st at i c voi d Mai n( )
{
Consol e. Wr i t eLi ne( " Hol a Mundo" ) ;
}
}

En general, siempre que se desee utilizar una clase de un determinado espacio de
nombres es necesario importar dicho espacio. C#proporciona muchos espacios de
nombres y tambin el programador puede construir sus propios espacios de nombres.
Ms adelante profundizaremos en este concepto.

Comentarios

La estructura de los comentarios es la misma que en C, C++y J ava.
Los caracteres / / hacen que la lnea que preceden sea un comentario.
Para crear un comentario de varias lneas, basta con encerrar entre los smbolos / * y */
el comentario.

Compilacin y ejecucin.
Se puede compilar un programa de dos modos:

- Utilizando la lnea de comando.
Marco Besteiro y Miguel Rodrguez Introduccin a C#
3/31
- Creando un proyecto en el IDE de Visual Studio 7.0
Compilacin desde la lnea de comando.
Para compilar desde la lnea de comando se han de realizar los siguientes pasos:

a) Crear el fichero fuente utilizando cualquier editor de texto y guardarlo en un
fichero con extensin . cs, que es la extensin de los ficheros fuente de C#. Por
ejemplo, Hol a. cs.
b) Invocar al compilador para compilar el fichero fuente. Para ello se ejecuta el
programa csc. exe que se proporciona con el Visual Studio. Dicho programa
puede utilizar como parmetro el nombre del fichero:

csc Hol a. cs

Se crea entonces el fichero Hol a. exe en el mismo directorio donde se ubica el
fichero fuente.

Nota: para cargar Visual Studio .NET en modo comando se ha de utilizar
Programas/Microsoft Visual Studio 7.0/ Visual Studio NET Tools/Visual Studio
NET Command Prompt, como se indica en la figura 1.1.







Figura 2.1

c) Ejecutar el programa:
Marco Besteiro y Miguel Rodrguez Introduccin a C#
4/31

Hol a

En la figura 2.2 se pueden observar estos pasos y la salida del programa.



Figura 2.2

Diferentes posibilidades de compilacin
C#nos proporciona mucha flexibilidad a la hora de compilar. Aunque no se pretende
hacer ahora un estudio exhaustivo de las distintas formas de compilacin, a
continuacin se estudian de manera resumida algunas formas de compilar desde la lnea
de comando:

a) Para compilar el fichero Ej empl o. cs generando Ej empl o. exe:

csc Ej empl o. cs

b) Para compilar Ej empl o. cs generando Ej empl o. dl l

csc / t ar get : l i br ar y Ej empl o. cs

c) Para compilar Ej empl o. cs sin generar ejecutable, nicamente para comprobar
su sintaxis.

csc / noout put Ej empl o. cs

d) Para compilar Ej empl o. cs y generar Pepe. exe

csc / out : Pepe. exe Fi l e. cs

e) Para compilar todos los ficheros C#del directorio actual con optimizacin y
definiendo el smbolo DEBUG, generando como salida Ej empl o2. exe.

csc / def i ne: DEBUG / opt i mi ze / out : Ej empl o2. exe *. cs

f) Para compilar todos los ficheros C#del directorio actual generando una versin
debug de Ej empl o2. dl l . No se mostrarn mensajes informativos durante la
Marco Besteiro y Miguel Rodrguez Introduccin a C#
5/31
compilacin -comienzo, final e informacin intermedia- y tampoco advertencias
o warnings.

csc / t ar get : l i br ar y / out : Ej empl o2. dl l / war n: 0 / nol ogo / debug
*. cs

g) Para compilar todos los ficheros C#del directorio actual generando la librera
Pepe. xyz, que es realmente una dll.

csc / t ar get : l i br ar y / out : Pepe. xyz *. cs
Compilacin desde el Visual Studio 7.0
Para compilar desde el IDE se han de realizar los siguientes pasos:

a) Crear un proyecto nuevo.

Esto se puede hacer directamente al arrancar el Visual Studio, pulsando con el
ratn en el botn Nuevo Proyecto en la ventana inicial de la Pgina de Inicio (figura
2.3):




Figura 2.3. Ventana inicial de Visual Studio

O bien desde el men: Archivo/Nuevo/Proyecto (figura 2.4):


Marco Besteiro y Miguel Rodrguez Introduccin a C#
6/31


Figura 2.4. Creando un nuevo proyecto.

b) Elegir como tipo de proyecto Proyectos de Visual C#, y como plantilla
Aplicacin de Consola (figura 2.5):



Marco Besteiro y Miguel Rodrguez Introduccin a C#
7/31
Figura 2.5. Pantalla de configuracin de un nuevo proyecto.

Este es un buen momento para dar nombre al proyecto (caja de textos Nombr e) y decidir
el lugar en el que ser almacenado (caja de texto Ubi caci n). En este ejemplo se
dejarn los valores que el programa propone por defecto. El resultado ser el de la
figura 2.6:



Figura 2.6. Cdigo generado por Visual Studio .NET

Se crea una clase Cl ass1, que es la que debe implementar la funcionalidad y que posee
un mtodo Mai n( ) y un constructor (figura 2.6). Como se ve, la estructura mnima que
se ofrece es una clase, ya que la filosofa C#para .NET es trabajar nicamente con
clases, no con funciones ni variables globales.

c) El siguiente paso es aadir el cdigo necesario apoyndose en las facilidades de
desarrollo que ofrece el IDE del Visual Studio 7.0. (figura 2.7).

Se puede observar que, directamente, se importa el namespace Syst em. Cuando se est
escribiendo el cdigo, despus de escribir la clase Consol e y el punto para invocar al
mtodo Wr i t eLi ne, automticamente se presenta una ventana donde se puede elegir el
nombre del mtodo, bien con el cursor o bien escribiendo las primeras letras del mtodo
(ver figura 2.7). Cuando el foco est en el mtodo, basta con pulsar RETURN y se
escribe el mtodo Wr i t eLi ne( ) . Al abrir el parntesis, aparece la ayuda sobre el tipo de
argumentos que puede recibir el mtodo.
Marco Besteiro y Miguel Rodrguez Introduccin a C#
8/31


Figura 2.7. El IDE proporciona mltiples ayuda para escribir cdigo.

d) Una vez escrito el cdigo, se ha de construir el proyecto: Generar/Generar
(figura 2.8) .

Marco Besteiro y Miguel Rodrguez Introduccin a C#
9/31


Figura 2.8. Compilando un proyecto.

e) Si no se ha cometido ningn error, se puede ejecutar en modo Debug o sin el
depurador. En este ejemplo se ejecutar sin el depurador. Para ello se ejecuta la
opcin de men Depurar/Iniciar sin Depurar (figura 2.9)

Marco Besteiro y Miguel Rodrguez Introduccin a C#
10/31


Figura 2.9. Ejecucin de un programa.

f) El resultado ser el de la figura 2.10:



Figura 2.10. Resultado de la compilacin.

Aunque el resultado ha sido el mismo que cuando se ha compilado desde la lnea de
comandos, en este caso se crean muchos ms ficheros, que se pueden dividir en tres
grupos (figura 2.11):

Marco Besteiro y Miguel Rodrguez Introduccin a C#
11/31
g) Ficheros Fuente:
-Fichero fuente: Cl ass1. cs.
-Fichero informacin sobre el assembly: Assembl yI nf o. cs.
-Fichero de proyecto: Consol eAppl i cat i on1. cspr oj .
-Etc...

h) Ficheros objeto, en la carpeta obj : Aunque esta carpeta se genera para un
proyecto en C#, realmente no es necesaria, ya que el compilador a IL no genera
ficheros objeto, sino que crea directamente el . exe o . dl l especial de la
plataforma .NET.

a. Versin Debug.
b. Versin Release.

i) Ficheros binarios en cdigo IL(carpeta bi n):

a. Versin Debug.
b. Versin Release.



Figura 2.11. Ficheros que genera Visual Studio al compilar un proyecto.
Entradas y salidas

a) WriteLine()

Marco Besteiro y Miguel Rodrguez Introduccin a C#
12/31
Anteriormente, se han explicado los mtodos Wr i t eLi ne( ) y Wr i t e( ) de la clase
Consol e. Sin embargo no se han estudiado las entradas y salidas con formato.
Realmente, no es lo ms habitual utilizar este lenguaje para hacer aplicaciones de
consola y por ello se tocar este punto de manera superficial.

Wr i t eLi ne( ) en un mtodo esttico que no devuelve nada y que escribe el o los datos
que especifica en su argumento seguido de un retorno de carro y salto de lnea al final.
Es un mtodo que est sobrecargado y puede tener como argumento un dato de
cualquier tipo. Adems puede tener varios argumentos y es relativamente sencillo dar
formato a la salida. Las posibilidades para escribir los datos son muchas. Aqu slo se
harn algunas consideraciones de una de las ms importantes:
publ i c st at i c voi d Wr i t eLi ne( st r i ng, par ams obj ect [ ] ) ;
En esta forma, el segundo argumento es opcional. Se imprime la cadena y donde se van
sustituyendo cada {i } por los argumentos situados despus de la primera coma.
Por ejemplo: escriba este cdigo en el mtodo Mai n( ) del programa anterior.

i nt unEnt er o = 7;
st r i ng unaCadena = " Hol a Mundo" ;
doubl e unDoubl e = 6. 86;
Consol e. Wr i t eLi ne( " Mi f r ase es {0}" , unaCadena) ;
Consol e. Wr i t eLi ne( " var 1={0} var 2={1} var 3={2}" ,
unEnt er o, unDoubl e, unaCadena) ;


Figura 2.12. Resultado de la ejecucin del programa.

b) ReadLine()

La clase Consol e proporciona dos mtodos bsicos para introducir datos por teclado
desde la consola. Dichos mtodos son Read( ) y ReadLi ne( ) y tienen la siguiente
estructura.

i nt Read( ) ;
st r i ng ReadLi ne( ) ;

Cuando el programa llega a la lnea que contiene cualquiera de estos dos mtodos,
simplemente espera a que el usuario introduzca una cadena y pulse INTRO.

Los siguientes ejemplos muestran la idea explicada:

Marco Besteiro y Miguel Rodrguez Introduccin a C#
13/31
/ / Fi cher o Ent r adaSal i da. cs
/ *En est e pr ogr ama se pi de el nombr e al usuar i o y se
devuel ve un sal udo*/

usi ng Syst em;
cl ass Ent r adaSal i da
{
publ i c st at i c voi d Mai n( )
{
Consol e. Wr i t e( " Buenos d as. Deme su nombr e" ) ;
st r i ng unaCadena = Consol e. ReadLi ne( ) ;
Consol e. Wr i t eLi ne( " Apr ender C# en segui da Sr . {0}" , unaCadena) ;
}
}


/ / Fi cher o Cl aseCi r cul o
/ / Cal cul o del ar ea de un c r cul o pi di endo el r adi o por consol a
usi ng Syst em;
cl ass Cl aseCi r cul o
{
publ i c st at i c voi d Mai n( )
{
Consol e. Wr i t e( " Dame el r adi o del c r cul o" ) ;
i nt r adi o = Consol e. Read( ) ;
f l oat ar ea = 3. 14*r adi o*r adi o;
Consol e. Wr i t eLi ne( " El ar ea del ci r cul o
de r adi o {0} es {1}" , r adi o, ar ea) ;
}
}
ReadLi ne( ) devuelve una cadena formada por los caracteres introducidos por el teclado
hasta que se pulsa la tecla INTRO. Se devuelve una cadena en la que se ignoran los
caracteres correspondientes al salto de lnea y al retorno de carro.

Read( ) devuelve un entero correspondiente al carcter de la tecla pulsada. Tambin
espera a que se pulse la tecla INTRO. En este caso es conveniente decir que una vez
pulsado INTRO, se quedan en el buffer de entrada los caracteres correspondientes al
salto de lnea y al retorno de carro. Si se deseara utilizar este mtodo de nuevo, habra
que limpiar el buffer de entrada. Puede hacerse de varias maneras, pero quiz dos
formas simples son las que se indican a continuacin:

a) Ejecutar Consol e. ReadLi ne( ) .
b) Ejecutar dos veces Consol e. Read( ) .

Consideraciones sobre el mtodo Main()
Para las aplicaciones de consola, Mai n( ) puede tomar cuatro formas:

publ i c st at i c voi d Mai n( )
publ i c st at i c i nt Mai n( )
publ i c st at i c voi d Mai n( st r i ng[ ] ar gs)
publ i c st at i c i nt Mai n( st r i ng[ ] ar gs)

Las dos primeras se utilizan cuando no se desea pasar a la aplicacin ningn argumento.
Se diferencian entre ellas en el valor devuelto. Cuando concluye la aplicacin, en la
Marco Besteiro y Miguel Rodrguez Introduccin a C#
14/31
segunda forma se devuelve un entero. Si la aplicacin ha terminado correctamente se
devuelve un cero. En caso contrario, un valor distinto de cero.

Es posible declarar el mtodo Mai n( ) para que reciba los valores que se deseen pasar a
la aplicacin. Para ello, se utilizan las dos formas siguientes de Mai n( ) . Se diferencian
en lo mismo que las anteriores: una devuelve un entero y la otra nada. Sin embargo,
Mai n( ) tiene como parmetro un array de st r i ng o cadenas. Cada uno de los valores
que se le pasan a la aplicacin se almacenan de manera consecutiva en los elementos del
array.

El ejemplo siguiente refleja bien esta idea. Se trata de imprimir los parmetros que se
pasan a la aplicacin. Para ello se siguen los pasos que se indican a continuacin.

a) Crear un fichero de nombre Cl asePr ueba. cs con el cdigo siguiente:

/ / Fi cher o Cl asePr ueba. cs
usi ng Syst em;
cl ass Cl asePr ueba
{
st at i c voi d Mai n( st r i ng[ ] ar gs)
{
f or ( i nt i =0; i <ar gs. Lengt h; i ++)
Consol e. Wr i t eLi ne( " Ar gument o {0} es {1}" , i , ar gs[ i ] ) ;
}
}


b) A continuacin, se compila:

csc Cl asePr ueba. cs.

Se genera el fichero Cl asePr ueba. exe

c) Se ejecuta la aplicacin proporcionando unos determinados parmetros. Pueden
ser los que se desee en nmero y pero sern almacenados como cadenas. Por
ejemplo:

Cl asePr ueba Mi guel 23 67. 89 Hol aMundo

d) El resultado de este programa es el siguiente:

Ar gument o 0 es Mi guel
Ar gument o 1 es 23
Ar gument o 2 es 67. 89
Ar gument o 3 es Hol aMundo



Marco Besteiro y Miguel Rodrguez Introduccin a C#
15/31

Espacio de nombres (Namespace)
Introduccin
Microsoft proporciona una serie de clases, tipos de datos, enumeraciones, estructuras,
etc, predefinidos que se contienen en la librera .NET. Todo este cdigo est contenido
en espacios de nombres o namespace -equivalentes a los paquetes en J ava- . Un
namespace no es ms que un directorio lgico -no fsico- dentro de la librara .NET
donde se incluye cdigo relacionado entre s. Una buena costumbre de programacin
consiste en ir creando namespace propios donde se incluyan las clases personales.

Por ejemplo, la clase Consol e est incluida en el namespace Syst em. Si se quiere
utilizarla por ejemplo porque se desea utilizar el mtodo esttico Wr i t eLi ne( ) - se
puede hacer de dos maneras:

a) Llamar a la clase directamente. Para ello, hay que llamarla con el nombre de la
clase, precedida del nombre del namespace donde est incluida y separadas por
el operador punto (. ):

Syst em. Consol e. Wr i t eLi ne( Hol a Mundo) ;

b) Importar el namespace Syst emy utilizar directamente la clase en el cdigo:
Para importar un namespace, se utiliza la palabra usi ng seguida del nombre del
namespace. Esto debe hacerse antes de la declaracin de cualquier clase:

usi ng Syst em; / / Par a i mpor t ar el namespace
.
Consol e. Wr i t eLi ne( Hol a Mundo) ;

Para incluir una clase o un tipo de dato en un determinado namespace, basta con
incluirla entre llaves despus del nombre del namespace. Por ejemplo, para incluir la
clase Hol a en el namespace Mi sCl ases:

usi ng Syst em;
namespace Mi sCl ases
{
cl ass Hol a
{
publ i c st at i c voi d Mai n( )
{
Consol e. Wr i t eLi ne( " Hol a Mundo" ) ;
}
}
}

Para utilizarla, puede hacerse importando el namespace usi ng Mi sCl ases- e
invocando a la clase o bien llamando a la clase directamente: Mi sCl ase. Hol a

En general, los programas C#se organizan utilizando namespaces, que ofrecen:

- Un sistema de organizacin interna para un programa.
Marco Besteiro y Miguel Rodrguez Introduccin a C#
16/31
- Un sistema de organizacin externa para otros programas, es decir un modo de
presentar los elementos del programa a otros programas.

Para facilitar el uso de los namespaces se utiliza la directiva usi ng.
Unidades de Compilacin.
Una unidad de compilacin consiste en cero o ms directivas usi ng seguidas de cero o
ms declaraciones de namespace.

Un programa C#consiste en una o ms unidades de compilacin, cada una en un fichero
fuente separado. Cuando un programa C# es compilado, todas las unidades de
compilacin se procesan juntas. Por tanto, las unidades de compilacin pueden
depender entre si.

Si no se indica un namespace concreto, los miembros de una unidad de compilacin
pertenecen al namespace global.

Declaracin de namespaces.
Una declaracin de namespace consiste en la palabra clave namespace seguida de un
nombre de namespace y un cuerpo, seguido opcionalmente por un ; .

Las declaraciones de varios namespace se pueden anidar entre s.

Por ejemplo:

namespace N1. N2
{
cl ass A {}
cl ass B {}
}

Es equivalente semnticamente a:

namespace N1
{
namespace N2
{
cl ass A {}
cl ass B {}
}
}


Los namespaces son pblicos por defecto y no pueden utilizarse modificadores de
acceso en la declaracin de los namespace.

En el cuerpo de un namespace, las directivas opcionales usi ng permiten importar otros
namespaces, cuyos tipos podrn ser utilizados sin tener que precederlos del nombre del
namespace al que pertenecen.

Marco Besteiro y Miguel Rodrguez Introduccin a C#
17/31
Directivas using y namespaces.
Las directivas usi ng facilitan el uso de namespace y tipos definidos en otros
namespace.

Las directivas de tipo using-alias-directive introducen un alias para un namespace o
un tipo.

Ejemplo:

namespace N1. N2
{
cl ass A {}
}
namespace N3
{
usi ng R1 = N1;
usi ng R2 = N1. N2;
cl ass B
{
N1. N2. A a; / / r ef er enci a a l a cl ase N1. N2. A
R1. N2. A b; / / r ef er enci a a l a cl ase N1. N2. A
R2. A c; / / r ef er enci a a l a cl ase N1. N2. A
}
}

Las directivas de tipo using-namespace-directive importan los tipos miembro de un
namespace.

Ejemplo:

namespace N1. N2
{
cl ass A {}
}
namespace N3
{
usi ng N1. N2;
cl ass B: A {}
}


Ejemplo:

usi ng Syst em;
namespace Al gunEspaci oDeNombr es
{
publ i c cl ass Mi Cl ase
{
publ i c st at i c voi d Mai n( )
{
Espaci oCaj a. Cl aseDel Espaci oCaj a. Deci r Hol a( ) ;
}
}

namespace Espaci oCaj a
{
publ i c cl ass Cl aseDel Espaci oCaj a
Marco Besteiro y Miguel Rodrguez Introduccin a C#
18/31
{
publ i c st at i c voi d Deci r Hol a( )
{
Consol e. Wr i t eLi ne( " Hol a" ) ;
}
}
}
}

Anexo
Diferencias entre el compilador de C# y C++.
Como se ha comentado, el compilador de C#no genera ficheros . obj , sino que crea
directamente los ficheros .exe o . dl l . Como consecuencia de esto, el compilador de C#
no necesita el enlazador o linker.

Se puede apreciar en el men Generar que no existe la pareja de opciones Compilar y
Generar, sino nicamente Generar, debido a que ya no es necesario compilar para
generar los ficheros objeto y luego construir para enlazar los ficheros objeto con el resto
de libreras. Ahora se construye directamente el assembl y con el cdigo intermedio
MSIL.
Desensamblado del cdigo IL.
El ejecutable generado tras compilar el fichero . cs (tanto utilizando Visual Studio
como la lnea de comando) no es realmente un ejecutable, aunque aparezca con la
extensin . exe. Tiene un formato muy similar a un ejecutable (el formato de un exe es
PE) pero contiene cdigo intermedio MSIL, as como metadatos y el fichero de
manifiesto.

Si se desea, es posible desensamblar el fichero . exe correspondiente a una aplicacin
.NET utilizando la herramienta de desensamblaje ILDASM.

Para ello se utiliza el programa i l dasm. exe suministrado con Visual Studio (figura
2.12):


Figura 2.12. Desensamblando un fichero .exe

El resultado ser el de la figura 2.13:

Marco Besteiro y Miguel Rodrguez Introduccin a C#
19/31


Figura 2.13. Programa ILDASM

A travs de la herramienta ILDASM se puede observar el contenido de una aplicacin
.NET. Para obtener tanto el fichero de manifiesto como el cdigo IL contenido en la
aplicacin y su representacin con nmnicos y otros se puede hacer doble click
sucesivamente en las distintas lneas de la ventana:




Figura 2.14. Fichero de manifiesto.
Marco Besteiro y Miguel Rodrguez Introduccin a C#
20/31







Figura 2.15

Figura 2.16



Figura 2.17

Creacin y uso de dll en C#.
Una librera de enlace dinmico se enlaza con la aplicacin en tiempo de ejecucin. En
el siguiente ejemplo se puede ver cmo construir una dll:

a) Mi Li br er i a. dl l : es el fichero de la librera, contiene los mtodos que sern
invocados en tiempo de ejecucin. En este ejemplo sern Sumar y Mul t i pl i car .
Marco Besteiro y Miguel Rodrguez Introduccin a C#
21/31
b) Cl aseAdi ci on. cs: es el fichero fuente en el que est definida la clase
Cl aseAdi ci on, que tiene el mtodo esttico Sumar ( l ong i , l ong j ) , el cual
devuelve el resultado de sumar sus parmetros. La clase Cl aseAdi ci on
pertenece al namespace Mi Li br er i a.
c) Cl aseMul t i p. cs: es el fichero fuente en el que est definida la clase
Cl aseMul t i p, con el mtodo esttico Mul t i pl i car ( l ong x, l ong y) , el cual
devuelve el resultado de multiplicar sus parmetros. La clase Cl aseMul t i p
pertenece al namespace Mi sMet odos.
d) Mi Apl i caci on. cs: es el fichero que contiene el mtodo Mai n( ) . A partir de este
fichero se generar el . exe que utilizar los mtodos de las clases
Cl aseAdi ci on y Cl aseMul t i p, contenidas en la librera Mi Li br er i a. dl l .

Los ficheros fuente son:

ClaseAdicion.cs
/ / Suma dos nmer os
usi ng Syst em;
namespace Mi Li br er i a
{
publ i c cl ass Cl aseAdi ci on
{
publ i c st at i c l ong Sumar ( l ong i , l ong j )
{
r et ur n( i +j ) ;
}
}
}

ClaseMultip.cs
/ / Mul t i pl i ca dos nmer os
usi ng Syst em;
namespace Mi Li br er i a
{
publ i c cl ass Cl aseMul t i p
{
publ i c st at i c l ong Mul t i pl i car ( l ong x, l ong y)
{
r et ur n ( x*y) ;
}
}
}
MiAplicacion.cs
usi ng Syst em;
usi ng Mi Li br er i a ;
cl ass Mi Apl i caci on
{
publ i c st at i c voi d Mai n( st r i ng[ ] ar gs)
{
Consol e. Wr i t eLi ne( " Ll amando a mt odos desde Mi Li br er i a. dl l : " ) ;
i f ( ar gs. Lengt h ! = 2)
Marco Besteiro y Miguel Rodrguez Introduccin a C#
22/31
{
Consol e. Wr i t eLi ne( " I nt r oduci r : <num1> <num2>" ) ;
r et ur n;
}
l ong num1 = l ong. Par se( ar gs[ 0] ) ;
l ong num2 = l ong. Par se( ar gs[ 1] ) ;
l ong suma = Cl aseAdi ci on. Sumar ( num1, num2) ;
l ong pr oduct o = Cl aseMul t i p. Mul t i pl i car ( num1, num2) ;
Consol e. Wr i t eLi ne( " La suma de {0} y {1} es {2}" ,
num1, num2, suma) ;
Consol e. Wr i t eLi ne( " El pr oduct o de {0} y {1} es {2}" ,
num1, num2, pr oduct o) ;
}
}

Para indicar que en la clase Mi Apl i caci on se van a utilizar los mtodos de las clases
Cl aseAdi ci on y Cl aseMul t i p hay que importar el namespace que contiene las clases,
no la dll (el assembly) en la que se almacenarn. Esto es muy importante, porque
reduce la utilizacin de una clase a una referencia lgica, evitando el engorro y los
problemas de versiones que supone tener que importar y exportar mtodos de una dll
concreta.
Compilacin y ejecucin.
a) Compilacin desde la lnea de comando.

Para crear la librera Mi Li br er i a. dl l se ha de ejecutar la siguiente lnea de comando:

csc / t ar get : l i br ar y / out : Mi Li br er i a. dl l Cl aseAdi ci on. cs Cl aseMul t i p. cs

La opcin / t ar get : l i br ar y indica al compilador que se desea generar una dll.
Si no se indicase el nombre de la dll mediante la opcin / out : Mi Li br er i a. dl l el
compilador tomara el nombre del primer fichero (Cl aseAdi ci on. cs) como nombre de
la dll (Cl aseAdi ci on. dl l ).

Para crear Mi Apl i caci on. exe se ha de ejecutar la siguiente lnea de comando:

csc / out : Mi Apl i caci on. exe / r ef er ence: Mi Li br er i a. dl l Mi Apl i caci on. cs

La opcin / r ef er ence: permite indicar al compilador qu dll va a utilizar el ejecutable
a generar.



b) Ejecucin desde la lnea de comando.

Para ejecutar el programa Mi Apl i caci on. exe slo hay que introducir un comando
similar al siguiente:

Mi Apl i caci on 100 25

La salida es la que se indica en la siguiente figura 2.18:

Marco Besteiro y Miguel Rodrguez Introduccin a C#
23/31

Figura 2.18

c) Compilacin desde el Visual Studio 7.0.

Para crear la dll desde Visual Studio 7.0 se ha de crear un nuevo proyecto de tipo
Biblioteca de Clases (figura 2.19):


Figura 2.19. Creacin de una dll desde Visual Studio .NET

Con lo que se crea una librera con una clase vaca:

Marco Besteiro y Miguel Rodrguez Introduccin a C#
24/31


Figura 2.20


Para aadir una nueva clase se puede hacer desde Proyecto/Agregar Clase,
y se obtiene la ventana de configuracin de la figura 2.21.
Marco Besteiro y Miguel Rodrguez Introduccin a C#
25/31

Figura 2.21

A continuacin se codifica su funcionalidad:



Marco Besteiro y Miguel Rodrguez Introduccin a C#
26/31
Figura 2.22

La misma operacin se ha de repetir para la clase Cl aseMul t i p.

Tras haber creado ambas clases, slo resta construir la dll (Generar/Generar).

El resultado ser el de la figura 2.23:


Figura 2.23

Donde la librera se encontrar en el directorio MiLibreria\bin\debug.


Figura 2.24

d) Creacin de Mi Apl i caci on. exe.

Slo falta crear Mi Apl i caci on. exe, que es el cliente que va a utilizar la dll. Se ha de
tener en cuenta que el espacio de nombres de las clases que hay en la dll se llama
Mi Li br er i a. Se siguen los pasos que se indican en las figuras 2.25 y 2.26.

Marco Besteiro y Miguel Rodrguez Introduccin a C#
27/31


Figura 2.25. Creacin de la aplicacin.



Figura 2.26. Ventana de cdigo.
Marco Besteiro y Miguel Rodrguez Introduccin a C#
28/31
Para poder utilizar las clases Cl aseAdi ci on y Cl aseMul t i p no basta con aadir la lnea
usi ng Mi Li br er i a al cdigo fuente. Adems se ha de aadir la referencia a la librera a
travs de la opcin de men Proyecto/Agregar referencia.



Figura 2.27. Es necesario referenciar la librera.

Esta opcin muestra un cuadro de dilogo en el que se puede elegir la o las libreras que
se van a referenciar desde el proyecto (figuras 2.27, 2.28 y 2.29).

Marco Besteiro y Miguel Rodrguez Introduccin a C#
29/31


Figura 2.28



Figura 2.29

Tras este paso ya se puede construir el ejecutable.
Marco Besteiro y Miguel Rodrguez Introduccin a C#
30/31
Si se ejecuta, se indicar que han de pasarse dos argumento. Es lo nico que falta para
poder probar este ejemplo.

Para indicar que se desea pasar argumentos de lnea de comando al ejecutable cuando se
pruebe, han de seguirse los pasos que se indican a continuacin:

Seleccionar la ventana del Explorador de Soluciones. Si no est tiene visible,
puede hacerse por medio del men Ver/Explorador de Soluciones, o pulsando el
primero de los iconos situados en la parte superior derecha del IDE (figura 2.30).

Seleccionar el nombre del proyecto en el Explorador de Soluciones y situarse en la
ventana de propiedades. Para verla, puede hacerse lo mismo que en el caso
anterior (Ver/Ventana de propiedades) o bien desde el icono situado en la parte
superior derecha del IDE. Tambin se puede pulsar F4. (figura 2.31)



Figura 2.30



Figura 2.31

Marco Besteiro y Miguel Rodrguez Introduccin a C#
31/31
Al seleccionar la ventana de propiedades aparecer el cuadro de dilogo
correspondiente, a travs del cual se podrn establecer los argumentos de lnea de
comandos para la ejecucin del proyecto (figura 2.32).



Figura 2.32. Se establecen los parmetros de la lnea de comandos.

Tras este paso slo resta ejecutar el proyecto y ver el resultado (figura 2.33).



Figura 2.33

You might also like