Title: Introduccin a 'NET
1Introducción a .NET
- Miguel Ángel Ramos Barroso
(2 horas aproximadamente)
2Qué no es .NET?
- El asesino de Java
- El asesino de Linux
- El asesino de Windows
- MS apropiándose de Internet
- Un complot para dominar el mundo
3Qué es .NET?
- Una visión
- Ejecutar software en cualquier lenguaje sobre
cualquier dispositivo (teléfonos, PDAs, Tablet
PCs) - Usar Internet para hacer los negocios más
eficientes y proporcionar servicios a los
consumidores - Nuevo modelo para compartir componentes
- Concepto y modelo de programación Servicio Web
XML - Nuevas formas de interactuar con PCs (uso de la
voz, reconocimiento de escritura)
4Qué es .NET?
- Una plataforma software
- Nuevo nivel .NET Framework
- Nueva herramienta Visual Studio.NET
- Unos servidores .NET Enterprise Servers
5Motivaciones (Programación)
- Motivado por el grado de complejidad que estaba
tomando la programación Windows y el propio S.O. - Interfaces de los APIs para los diferentes
lenguajes - Multitud de servicios duplicados
- Pocas posibilidades de reutilización del código
6Motivaciones (Despliegue)
Eliminar el infierno de las DLL
Win32 Conflictos entre las aplicaciones con una
librería en común en diferentes versiones
7En una frase
- .NET es el conjunto de nuevas tecnologías en las
que Microsoft ha estado trabajando durante los
últimos años con el objetivo de obtener una
plataforma sencilla y potente para distribuir el
software en forma de servicios que puedan ser
suministrados remotamente y que puedan
comunicarse y combinarse unos con otros de manera
totalmente independiente de la plataforma,
lenguaje de programación y modelo de componentes
con los que hayan sido desarrollados.
8Plataforma.NET
9Qué necesitamos
- Si queremos desarrollar aplicaciones para .NET
- Microsoft .NET Framework SDK
- Si sólo queremos ejecutar aplicaciones .NET
- Microsoft .NET Framework Redistributable
- Donde obtenerlos
- msdn.microsoft.com/net/
- Versiones
- .NET Framework
- v1.0, 1.1
- v2.0
- .NET Compact Framework
- v1.0 y v2.0
10NET Framework
11NET Framework
12Common Language Runtime
13Common Language Runtime (CLR)
- Es el motor de ejecución de las aplicaciones .NET
Framework. - Administración del código (carga y ejecución) -gt
Código gestionado. - Aislamiento de la memoria de la aplicación.
-gtAppDomains. - Comprobación de la seguridad de los tipos.
14Componentes del CLR
.NET Framework Class Library Support
Thread Support
COM Marshaler
Security Engine
Debug Engine
MSIL to Native Compilers
Code Manager
Garbage Collector
Class Loader
15Qué no es el CLR
- Las aplicaciones .NET no son interpretadas por
una maquina virtual El CLR compila el código
MSIL a código máquina nativo. - El CLR no está limitado a la plataforma
Microsoft Es técnicamente posible portar el
CLR a otras plataformas hardware, así como a
otros SO. - Proyecto Mono http//www.go-mono.com/
16Shared Source CLI (Rotor)
- Ejemplo de implementación completa de los
estándares ECMA/ISO - 334 Lenguaje C
- 335 Common Language Infraestructure (CLI)
- http//msdn.microsoft.com/net/sscli
- Descargar configurar entorno buildall irse a
tomar un café - Distribución de código fuente, no comercial
- Modificable, Fácil de redistribuir y compartir
cambios - Implementación independiente plataforma
- Compilar/ejecutar en FreeBSD, Windows XP
- y MAC OS X
17Estadísticas
- Sobre 16MB de descarga (comprimido .tgz)
- 3,6 millones de líneas de código
- 27 MB de código C y C
- 8 MB de código C
- Un puñado de código en ensamblador ?
- 6000 ficheros fuente, 1200 clases
- Después de compilar
- Sobre 20 DLLs
- Sobre 20 EXEs
- 4 grandes áreas en el código
- Compilador y herramientas
- Frameworks
- Runtime
- Capa de portabilidad, tests, e
infraestructura para compilar
18Qué implementa SSCLI
VS.NET
System.Web
System.WinForms
ECMA-334
UI
SessionState
C
Design
ComponentModel
HtmlControls
Caching
JScript
Security
WebControls
System.Drawing
Configuration
VB
System.Web.Services
VC/MC
Drawing2D
Printing
Protocols
Imaging
Text
Debugger
Description
Discovery
Designers
System.Data (ADO.NET)
System.Xml
ADO
SQL
SDK Tools
Design
Adapters
CorDBG
System
ECMA-335
ILAsm
Collections
IO
Security
Runtime
InteropServices
Configuration
Net
ServiceProcess
ILDbDump
Remoting
Diagnostics
Reflection
Text
SN
Serialization
Globalization
Resources
Threading
ILDAsm
Common Language Runtime
MetaInfo
JIT
GC
App Domain Loader
PEVerify
MSIL
Common Type System
Class Loader
Platform Abstraction Layer
Networking
Boot Loader
Sync
Threads
Timers
Filesystem
19Proyecto Mono
- Implementación open source del .NET Framework
- Compilador de C, VB.NET, CLR, librería de
clases, etc. - Pretende llevar .NET a
- Linux/x86, Linux/PPC, S390, StrongARM, SPARC,
HPPA, SPARC v9 - Implementa ADO.NET, ASP.NET, etc.
- Información del proyecto
- www.go-mono.com
- Allí podeis descargar todo el
- código fuente
20El despliegue
21- Código intermedio en un lenguaje tipo
ensamblador orientado a objetos IL -
modo independiente de la plataforma de
representar código gestionado
22Módulo
- Un archivo DLL o EXE Windows PE (Portable
Executable) - Contiene código en lenguaje intermedio (IL),
metadatos y opcionalmente el manifiesto del
assembly
23Módules o Modules
- Los módulos son ficheros que pueden ser de dos
tipos - ficheros o módulos de recursos(ficheros.gif,
.html, etc.). - ficheros o módulos de código compilado(código
MSIL). - En la plataforma .NET se distinguen tres tipos de
módulos de código compilado - Ejecutables (ficheros.exe) .
- Librerías de enlace dinámico (ficheros.dll).
- Módulos que conforman un ensamblado
(ficheros.netmodule)
24Módulo
25Módulo
- Metadatos datos sobre los datos
- Los metadatos proporcionan información adicional
a los tipos declarados en el IL y son usados por
el CLR - El CLR usa varios compiladores para traducir IL a
código nativo en tiempo de ejecución o JIT - Un módulo de código compilado se compone de
- Cabecera de CLR que le informa de si es un módulo
gestionado, la versión del CLR que necesita, su
firma digital... - Los metadatos que son información sobre los tipos
definidos en su código. - Código IL.
26Assembly
- Un concepto que introduce .NET
- Unidad primaria de implantación.
- Autodescriptivo e independiente de la plataforma.
- Compuesto de un manifiesto y uno o más módulos.
- Todo el programa, con sus archivos de recursos
(imágenes, páginas HTML, etc) es agrupado en un
solo bloque llamado ensamblado. - Tienen forma de .exe o de .dll y contienen todos
los datos necesarios para la aplicación. El .exe
ya no es sólo el código. - Además, contiene datos que lo describen e indican
qué elementos tiene en su interior ? Metadatos.
27Assembly
Identidad (nombre, versión...) Nombres de los
ficheros del ensamblado Clave hash de todos los
ficheros Detalles sobre los tipos definidos en el
ensamblado (accesibilidad desde otros...) Nombres
y hashes de otros ensamblados Permisos de
seguridad Una lista de los tipos de datos
exportados desde otros ficheros
- Manifiesto
- Contiene la identidad del assembly
- Nombre textual y número de versión
- Si es público, también contiene la clave pública
garantiza unicidad e identifica la fuente - Responsable de declarar la seguridad que requiere
- Lista de de todos los tipos expuestos y recursos
(GIFs, JPGs) en otros assemblies dependientes - El CLR lo usará para localizarlos
28Assembly
- Al contener todos los datos sobre sí mismos, no
es necesario que registren nada ? Una copia del
directorio es suficiente para ejecutar la
aplicación. Sin instalaciones. - Cada vez que se se cree una librería se creará su
ensamblado y tendrá sus propias políticas de
seguridad - Visores de ensamblado
- ILDASM (Herramienta de Microsoft)
- Visor extendido http//www.codeproject.com/dotnet
/asmex.asp
29Ensamblado o Assembly
- Dos tipos de ensamblado
- Privados Solo es usado por una aplicación que se
encuentra en la misma subcarpeta. Es el tipo que
crea el compilador por defecto. - También llamadas weakly named assemblies
- Públicos o compartidos Son ensamblados creados
para ser usados por cualquier aplicación. Se
almacenan en la caché global de ensamblado. - Deben ser strongly named (contiene la clave
pública y firma digital del que publica).
30La compilación
31.net Framework
Código Fuente
Visual Basic
C
C
Unmanaged component
Compiler
Compiler
Compiler
Código Gestionado
Assembly IL code
Assembly IL code
Assembly IL code
Common language runtime
JIT compiler
Native code
Operating system services
32Compilación y ejecución de código
Compilación
Código (IL)
Código fuente
Metadatos
Antes de la instalación o la primera vez que se
invoca a cada método
33Jitter Normal
- Es el que se suele usar por defecto, y sólo
compila el código MSIL a código nativo a medida
que va siendo necesario. - Así se ahorra tiempo y memoria al evitarse tener
que compilar innecesariamente código que nunca se
ejecute.
34Jitter Normal
- El cargador de clases del CLR sustituye
inicialmente las llamadas a métodos de las nuevas
clases que vaya cargando por llamadas a funciones
auxiliares (stubs) que se encarguen de compilar
el verdadero código del método. - Una vez compilado, la llamada al stub es
sustituida por una llamada directa al código ya
compilado, con lo que posteriores llamadas al
mismo no necesitarán compilación.
35Jitter Económico
- Funciona de forma similar al jitter normal solo
que no realiza ninguna optimización de código al
compilar sino que traduce cada instrucción MSIL
por su equivalente en el código máquina sobre la
que se ejecute. - Se utiliza en dispositivos empotrados con poca
memoria y potencia de CPU. - Aunque genere código más ineficiente es menor el
tiempo y memoria que necesita para compilar.
36Jitter Económico
- Para ahorrar memoria este jitter puede descargar
código ya compilado que lleve cierto tiempo sin
ejecutarse y sustituirlo de nuevo por el stub
apropiado. - Por estas razones, este es el jitter usado por
defecto en Windows CE, sistema operativo que se
suele incluir en los dispositivos empotrados
antes mencionados.
37Prejitter
- Permite compilar completamente cualquier
ejecutable o librería (cualquier ensamblado en
general) que contenga código gestionado y
convertirlo a código nativo. - De este modo posteriores ejecuciones del mismo se
harán usando esta versión ya compilada y no se
perderá tiempo en hacer la compilación dinámica.
Ngen.exe
38Compilación dinámica
- La compilación dinámica supone que la aplicación
se ejecute más lentamente. - Es una solución más eficiente que la utilizada en
Java donde se interpreta cada código. - Permite que el jitter tenga más información sobre
la máquina que un compilador tradicional pudiendo
optimizar el código generado para ella (usando
instrucciones para PentiumIV, registros extra...)
39Ejemplo de Multi assembly
40Multi-file Assembly
- Vamos a crear un assembly que consiste de dos
clases - SimpleMath en VB.NET con métodos Add y Substract
- ComplexMath en C con método Square
- Físicamente la assembly consistirá de
- Simple.netmodule con SimpleMath
- Complex.netmodule con ComplexMath
- Math.dll que contiene el manifiesto
41Multi-file Assembly
- Pasos para crear la assembly
- Crear Complex.cs (4-multifileassembly\Weak)
- Compilarlo csc /targetmodule complex.cs
- Crear Simple.vb con vbc /targetmodule simple.vb
- Crear una assembly con AL (Assembly Linker) como
- al /targetlibrary /outMath.dll simple.netmodule
complex.netmodule - Crear MathDemo.cs
- Compilar MathDemo con csc /targetexe
/referencemath.dll mathdemo.cs - Ejecutar mathdemo.exe
42Código gestionado y no gestionado
43Managed / Unmanaged
- Cuando se compila un lenguaje en .NET pueden
generarse 2 tipos de código - Código gestionado (Managed) ? generado en la
mayoría de los casos. Código que el entorno de
ejecución puede controlar. - Código no gestionado (Unmanaged) ? generado
cuando se utiliza p/Invoke (llamadas a dlls de
windows..) o se usan componentes COM. Código que
el entorno no puede controlar.
44Managed Code
- Al compilarse un lenguaje en .NET no se genera
código máquina, sino que se genera código
intermedio (MSIL). - Es interpretado por el entorno de ejecución y
traducido por éste a instrucciones máquina - Además de esta traducción se añaden otros
servicios como la recolección de basura, gestión
de hilos de ejecución o servicios de seguridad. - El entorno de ejecución (CLR) controla este
código y le aporta servicios extra.
45Unmanaged Code
- No siempre es posible generar código gestionado.
- En ocasiones (usando p/Invoke o COM) ha de
generarse por fuerza código no gestionado. - Se traduce directamente a código máquina y no es
ejecutado por el entorno de ejecución. - Al no pasar por el CLR no puede disfrutar de sus
servicios recolector de basura, servicios de
seguridad, etc. - Una aplicación puede combinar código gestionado y
no gestionado.
46Managed VS Unmanaged
- Por tanto, mientras el código gestionado disfruta
de todos los servicios, el código gestionado no
lo hace - No es posible emplear los mecanismos de seguridad
que ofrece .NET dentro del código no gestionado - El código no gestionado es totalmente externo y
menos fiable de por sí
47Common Type System (CTS)
48Common Type System (CTS)
- El Sistema Común de Tipos o CTS, es el mecanismo
del CLR que permite definir el modo en que los
tipos serán creados y manipulados por el entorno
de ejecución de .NET Framework. - No se encarga directamente de su ejecución sino
que el CTS le dice al CLR cómo quiere que sea
ejecutado el código.
49Algunas Funcionalidades del CTS
- Integración de código escrito en diferentes
lenguajes. - Optimización del código en ejecución.
- Un modelo de tipos orientado a objeto, que
soporta múltiples lenguajes. - Una serie de normas que aseguran la
intercomunicación entre objetos.
50Qué es un tipo?
- No se trata sólo del conjunto de tipos de datos
con que podemos declarar variables en nuestro
código. - Se extiende a cualquier elemento que pueda ser
ejecutado dentro del entorno. - Todas las implementaciones de clases, interfaces,
estructuras, etc., ya sean nativas de la
plataforma o creadas por el programador, se
pueden considerar tipos válidos de .NET. - Todos los tipos que manipulamos dentro de .NET
Framework son objetos.
51Categorías de tipos
- Tipos por valor. Un tipo creado por valor,
almacena un dato que puede ser accedido de forma
directa. Los tipos por valor se organizan a su
vez en varios subgrupos, como son los tipos de
datos nativos de la plataforma .NET, tipos de
datos creados por el programador y tipos
enumerados.
52Categorías de tipos
- Tipos por referencia. Un tipo creado por
referencia, contiene la dirección de memoria en
donde reside un dato. Para acceder a dicho dato,
lo hacemos de forma indirecta utilizando esa
dirección de memoria o referencia. Los tipos por
referencia se organizan a su vez en varios
subgrupos, como son las clases propias de la
plataforma, las clases creadas por el
programador, interfaces, delegates, etc.
53Tipos por valor
54Tipos por referencia
55Valor vs. Referencia
- El CTS clasifica los tipos en dos bloques
- Por valor Se almacenan en la pila. Todos los
datos de tipo por valor descienden de
System.ValueTypes el cuál desciende de
System.Object. - Por referencia Se almacenan en el Heap (montón
de datos). Todos los datos de los tipos por
referencia descienden directamente de
System.Object.
56Clasificación de tipos del CTS
57Valor vs. Referencia
- Diferencias
- Liberación de memoria
- Los tipos por referencia hay que eliminarlos
explícitamente del montón (GC). - Asignación
- La asignación de tipos por referencia copia
direcciones de memoria. - Comparación de igualdad
- La comparación de tipos por referencia compara
direcciones de memoria.
58.NET built-in types I
59.NET built-in types II
60.NET built-in types III
- Como vemos CTS es un sistema de tipos
independiente del lenguaje de programación - No todos los tipos son soportados en cada
lenguaje, por ejemplo Date - En esos casos se puede usar el tipo .NET
directamente - System.DateTime d System.DateTime.Now
- CLS define un subconjunto de tipos de CTS que
pueden ser usadas cuando se definen librerías
multi-lenguaje - Tipos no compatibles con CLS no son soportados
por algunos lenguajes - Importante añadir atributo CLSCompliant a código
para que el compilador verifique los tipos usados
61Tipos personalizados
- EL Common Type System no sería muy flexible si no
permitiese al programador crear sus propios tipos
de datos. - Podremos definir tipos de datos personalizados
tanto por valor como por referencia.
62C class y struct I
- Generalmente creamos un tipo personalizado a
través de una clase - public class Persona
- public Persona(string nombre, string
apellido1, int edad) - Nombre nombre
- Apellido1 apellido1
- Edad edad
-
- public readonly string Nombre
- public readonly string Apellido1
- public readonly int Edad
- public bool Equals(Persona temp)
- if (temp.Nombre this.Nombre
temp.Apellido1 this.Apellido1 temp.Edad
this.Edad) - return true
- else
- return false
-
-
-
63C class y struct II
- Podemos crear nuevos tipos por valor a través de
struct - public struct Point
- public Point(int x, int y)
- this.x x
- this.y y
-
- private int x
- private int y
-
- ...
- Point p new Point(10,20)
64Concepto boxing/unboxing
- Para asegurar que todo sea un objeto, .NET
ofrece un tipo por referencia por cada tipo por
valor - A esto se le denomina boxed type del tipo por
valor - int i 123
- object o i
- CLR creará un nuevo objeto conteniendo una copia
de i en el heap, una referencia al objeto se
guardará en o. - Para hacer un unbox de un tipo por referencia se
usa casting - int i (int)o
- Se generará InvalidCastException si se trata de
hacer un unbox de un tipo incompatible - v.Add(3) // se permite gracias al concepto de
boxing - v.Add(new Int32(3))
65System.Object
- Es la clase base de la cual todos los tipos por
referencia de .NET derivan - Provee los siguientes métodos
- Equals verifica si dos instancias son iguales
(implementación por defecto evalúa igualdad por
referencia) - Finalize ejecutado automáticamente cuando un
objeto es destruido. En c este método no aparece
y se usa NombreObjeto como en C - GetHashCode produce un código hash del objeto,
usado para guardar un objeto en una HashTable - GetType devuelve el tipo de un objeto, posible a
través de capacidades de Metadata en .NET - ReferenceEquals verifica si dos instancias son
idénticas - ToString devuelve una representación en forma de
string del objeto
66Librería de clases
67Clases de la plataforma .NET
- La librería de clases (FCL) es una librería
formada por cientos de tipos que permiten acceder
a los servicios ofrecidos por el CLR y a sus
funcionalidades más frecuentemente usadas. - Además el programador puede crear nuevas clases
que extiendan su funcionalidad y se integren
perfectamente con el resto de las clases de la
FCL.
68Clases de la plataforma .NET
- Esta librería de clases está en MSIL luego
cualquier lenguaje cuyo compilador genere MSIL
podrá usarla. - Con esta librería podemos crear todo tipo de
aplicaciones aplicaciones de consola, de
ventanas, servicios Web, ASP.NET...
69Clases de la plataforma .NET
- Dada la amplitud de la FCL, ha sido necesario
organizar las clases en ella incluida en espacios
de nombres que agrupen clases con funcionalidades
similares. - El espacio de nombres System es el espacio raíz
del que cuelgan todos los demás.
70Clases de la plataforma .NET
- Espacios de nombres más usados
- System Contiene tipos de datos muy usados, datos
básicos, tablas, excepciones... Es el raíz. - System.Object Soporta toda la jerarquía de las
clases de .NET. - System.Collections Colecciones de datos de uso
común como pilas, colas, listas... - System.Data Manipulación de base de datos. Forma
la denominada arquitectura ADO.NET.
71Clases de la plataforma .NET
- System.IO Manipulación de ficheros.
- System.Reflection Acceso a los metadatos que
acompañan a los módulos de código. - System.Math Funciones logarítmicas,
trigonométricas... - System.XML Acceso a datos en formato XML.
- Sytem.Web Aplicaciones Web.
72Common Language Specification
73CLS (Common Language Specification)
- Conjunto de características comunes, que deben
cumplir todos los lenguajes de la plataforma,
para poder integrarse entre sí. - Independiente del lenguaje.
- Integración entre lenguajes.
- Abierto a nuevos lenguajes.
74Lenguajes .NETMúltiples lenguajes soportados
- .NET es neutral con respecto al lenguaje
- Microsoft suministra
- Visual C .NET, Visual Basic .NET, Visual C
.NET, - JScript, Visual J .NET
- Terceros suministran
- COBOL, RPG, APL, Perl, Pascal, Smalltalk, Eiffel,
Fortran, Haskell, Mercury, Oberon, Oz, Python,
Scheme, Standard ML, LEA, hasta 26 lenguajes
75Lenguajes .NETCLS
CLR
FujitsuCOBOLExtensions
C
MicrosoftManaged CExtensions
COBOL
CLS
- Los lenguajes no tienen que exponer toda la
funcionalidad definida por el CLR
76Ejemplo - C Gestionado
- using ltmscorlib.dllgt
- using namespace System
- __gc public class HelloWorldCPP
-
- public
- void SayHelloCPP()
-
- ConsoleWriteLine("Hello World from C!")
-
77Ejemplo Visual Basic
Imports System Imports HelloWorldCPP Public
Class HelloWorldVB Inherits HelloWorldCPP Sub
SayHelloVB() Console.WriteLine ("Hello
World from Visual Basic!") End Sub End Class
78Ejemplo COBOL
000010 CLASS-ID. HelloWorldCOB INHERITS
HelloWorldVB. 000020 ENVIRONMENT DIVISION. 000030
CONFIGURATION SECTION. 000040 REPOSITORY. 000050
CLASS HelloWorldVB AS "HelloWorldVB" 000060
OBJECT. 000070 PROCEDURE DIVISION. 000080
METHOD-ID. SayHelloCOB. 000090 PROCEDURE
DIVISION. 000100 DISPLAY "Hello World from
COBOL!". 000110 END METHOD SayHelloCOB. 000120
END OBJECT. 000130 END CLASS HelloWorldCOB.
79Ejemplo C
using System class HelloWorldCS HelloWorldCOB
public void SayHelloCS() String
message "Hello World from C!"
Console.WriteLine(message)
80Ejemplos C
public static int Main() HelloWorldCS h
new HelloWorldCS() h.SayHelloCPP()
h.SayHelloVB() h.SayHelloCOB()
h.SayHelloCS() return 0
81Ejemplos
82Demo
83Hello World
- using System
- public class HelloWorld
-
- public static void Main()
-
- System.Console.WriteLine("Hello!")
-
84Compilando y ejecutando C
- Create Notepad Hello.cs
- The C source code
- Compile CSC Hello.cs
- Produces Hello.exe
- This is a portable executable
- Run Hello.exe
- Where is the CLR?
- MSCOREE.DLL
- System.DLL
85Qué hay en el IL?
- class public auto ansi beforefieldinit HelloWorld
extends mscorlibSystem.Object -
- .method public hidebysig static void Main()
cil managed -
- .entrypoint
- .maxstack 1
- IL_0000 ldstr "Hello!
- IL_0005 call void mscorlib
System.ConsoleWriteLine(string) - IL_000a ret
-
- .method public hidebysig specialname
rtspecialname instance void .ctor() cil managed -
- .maxstack 1
- IL_0000 ldarg.0
- IL_0001 call instance void
mscorlibSystem.Object.ctor() - IL_0006 ret
-
86Desensamblando IL
- Disassemble
- ILDASM Hello.EXE /outHello.IL
- Notepad Hello.IL
- Compile IL
- DEL Hello.EXE
- ILDASM Hello.IL
- Run Hello.EXE
- Look at the Manifest
- Run ILDASM (with no parameters)
- Open Hello.EXE
87Enlaces de interés
- GotDotNet The Microsoft .NET Framework
Community - http//www.gotdotnet.com/
- .NET home page
- http//www.microsoft.com/net/
- MSDN .NET Framework site
- http//msdn.microsoft.com/netframework/
- Website con ejemplos y ayuda en programación C
- http//www.c-sharpcorner.com/
- http//www.csharphelp.com/
- http//www.csharp-station.com/
- Implementación Open Source .NET (Proyecto mono)
- http//www.go-mono.com/
- Fundamental Class Library en la sección
Reference de .NET Framework SDK Documentation
88Dudas