Introducción a .NET

.NET es una plataforma de desarrollo gratuita de código abierto para compilar muchos tipos de aplicaciones, como las siguientes:

Comparta la funcionalidad entre diferentes aplicaciones y tipos de aplicación mediante bibliotecas de clases.

Con .NET, el código y los archivos del proyecto tienen el mismo aspecto, con independencia del tipo de aplicación que compile. Con cada aplicación tiene acceso a las mismas funcionalidades de tiempo de ejecución, API y lenguaje.

Multiplataforma

Puede crear aplicaciones .NET para muchos sistemas operativos, entre los que se incluyen los siguientes:

  • Windows
  • macOS
  • Linux
  • Android
  • iOS
  • tvOS
  • watchOS

Las arquitecturas de procesador compatibles incluyen las siguientes:

  • x64
  • x86
  • ARM32
  • ARM64

.NET le permite usar funcionalidades específicas de la plataforma, como las API del sistema operativo. Algunos ejemplos son Windows Forms y WPF en Windows, y los enlaces nativos a cada plataforma móvil desde Xamarin.

Para obtener más información, vea Directiva de ciclo de vida del sistema operativo compatible y Catálogo de .NET RID.

Código abierto

.NET es de código abierto y usa las licencias de MIT y Apache 2. .NET es un proyecto de .NET Foundation.

Para obtener más información, vea la lista de repositorios de proyectos en GitHub.com.

Soporte técnico

Microsoft admite .NET en Windows, macOS y Linux. Se actualiza de forma periódica por motivos de seguridad y calidad, el segundo martes de cada mes.

Las distribuciones binarias de .NET de Microsoft se compilan y prueban en servidores mantenidos por Microsoft en Azure y siguen los procedimientos de seguridad e ingeniería de Microsoft.

Red Hat admite .NET en Red Hat Enterprise Linux (RHEL). Red Hat y Microsoft colaboran para asegurarse de que .NET Core funciona bien en RHEL.

Tizen admite .NET en las plataformas Tizen.

Para obtener más información, vea Versiones y compatibilidad con .NET Core y .NET 5.

Herramientas y productividad

.NET ofrece una selección de lenguajes, entornos de desarrollo integrados (IDE) y otras herramientas.

Lenguajes de programación

.NET admite tres lenguajes de programación:

  • C#

    C# (pronunciado "si sharp" en inglés) es un lenguaje de programación moderno, basado en objetos y con seguridad de tipos. C# tiene sus raíces en la familia de lenguajes C, y a los programadores de C, C++, Java y JavaScript les resultará familiar inmediatamente.

  • F#

    El lenguaje F# admite los modelos de programación funcional, orientada a objetos e imperativa.

  • Visual Basic

    Entre los lenguajes de .NET, la sintaxis de Visual Basic es la más parecida al lenguaje humano normal, lo que facilita su aprendizaje. A diferencia de C# y F#, para los que Microsoft desarrolla nuevas características de forma activa, el lenguaje Visual Basic es estable. Visual Basic no es compatible con las aplicaciones web, pero sí con las API web.

Estas son algunas de las funcionalidades que admiten los lenguajes de .NET:

IDE

Los entornos de desarrollo integrado para .NET incluyen los siguientes:

  • Visual Studio

    Solo se ejecuta en Windows. Dispone de una amplia funcionalidad integrada diseñada para trabajar con .NET. La edición Community es gratuita para estudiantes, colaboradores de código abierto y particulares.

  • Visual Studio Code

    Es compatible con Windows, macOS y Linux. De código abierto y gratuito. Hay extensiones disponibles para trabajar con lenguajes de .NET.

  • Visual Studio para Mac

    Solo se ejecuta en macOS. Para desarrollar aplicaciones y juegos de .NET para iOS, Android y la web.

  • GitHub Codespaces

    Un entorno de Visual Studio Code en línea, actualmente en versión beta.

SDK y entornos de ejecución

El SDK de .NET es un conjunto de bibliotecas y herramientas para desarrollar y ejecutar aplicaciones .NET.

Al descargar .NET, puede elegir el SDK o un entorno de ejecución, como el de .NET o el de ASP.NET Core. Instale un entorno de ejecución en un equipo que quiera preparar para ejecutar aplicaciones .NET. Instale el SDK en un equipo que quiera usar para el desarrollo. Al descargar el SDK, obtiene automáticamente los entornos de ejecución.

La descarga del SDK incluye los componentes siguientes:

  • La CLI de .NET. Herramientas de la línea de comandos que puede usar para scripts de desarrollo local e integración continua.
  • El controlador dotnet. Un comando de la CLI que ejecuta aplicaciones dependientes del marco.
  • Los compiladores de los lenguajes de programación Roslyn y F#.
  • El motor de compilación MSBuild.
  • El entorno de ejecución de .NET. Proporciona un sistema de tipos, la carga de ensamblados, un recolector de elementos no utilizados, interoperabilidad nativa y otros servicios básicos.
  • Bibliotecas tiempo de ejecución. Proporciona tipos de datos primitivos y utilidades fundamentales.
  • El entorno de ejecución de ASP.NET Core. Proporciona servicios básicos para las aplicaciones conectadas a Internet, como aplicaciones web, aplicaciones de IoT y back-ends para dispositivos móviles.
  • El entorno de ejecución de escritorio. Proporciona servicios básicos para las aplicaciones de escritorio de Windows, como Windows Forms y WPF.

La descarga del entorno de ejecución incluye los componentes siguientes:

  • Opcionalmente, el escritorio o el entorno de ejecución de ASP.NET Core.
  • El entorno de ejecución de .NET. Proporciona un sistema de tipos, la carga de ensamblados, un recolector de elementos no utilizados, interoperabilidad nativa y otros servicios básicos.
  • Bibliotecas tiempo de ejecución. Proporciona tipos de datos primitivos y utilidades fundamentales.
  • El controlador dotnet. Un comando de la CLI que ejecuta aplicaciones dependientes del marco.

Para obtener más información, vea los siguientes recursos:

Sistema del proyecto y MSBuild

Una aplicación .NET se crea a partir de código fuente mediante MSBuild. Un archivo del proyecto ( .csproj, .fsproj o .vbproj) especifica destinos y tareas asociadas que se encargan de compilar, empaquetar y publicar código. Existen identificadores de SDK que hacen referencia a colecciones estándar de destinos y tareas. El uso de estos identificadores ayuda a reducir el tamaño de los archivos del proyecto y facilita el trabajo con ellos. Por ejemplo, este es un archivo del proyecto para una aplicación de consola:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net5.0</TargetFramework>
  </PropertyGroup>
</Project>

Y este es otro para una aplicación web:

<Project Sdk="Microsoft.NET.Sdk.Web">
  <PropertyGroup>
    <TargetFramework>net5.0</TargetFramework>
  </PropertyGroup>
</Project>

En estos ejemplos, el atributo Sdk del elemento Project especifica un conjunto de destinos y tareas de MSBuild que compilan el proyecto. El elemento TargetFramework especifica la versión de .NET de la que depende la aplicación. Puede editar el archivo del proyecto para agregar destinos y tareas adicionales específicos del proyecto.

Para obtener más información, vea Información general sobre el SDK de proyectos .NET y Plataformas de destino.

CI/CD

MSBuild y la CLI de .NET se pueden usar con diversas herramientas y entornos de integración continua, como:

Para obtener más información, vea Uso del SDK de .NET y herramientas de integración continua (CI)

NuGet

NuGet es un administrador de paquetes de código abierto diseñado para .NET. Un paquete NuGet es un archivo .zip con la extensión .nupkg que contiene código compilado (archivos DLL), otros archivos relacionados con ese código y un manifiesto descriptivo que incluye información como el número de versión del paquete. Los desarrolladores con código para compartir crean paquetes y los publican en nuget.org o un host privado. Los desarrolladores que quieren usar código compartido agregan un paquete a su proyecto y, después, pueden llamar a la API expuesta por el paquete en el código del proyecto.

Para obtener más información, vea la documentación de NuGet.

Documentación interactiva de .NET

.NET Interactive es un grupo de API y herramientas de la CLI que permiten a los usuarios crear experiencias interactivas en la web, markdown y cuadernos.

Para obtener más información, vea los siguientes recursos:

Modelos de ejecución

Las aplicaciones .NET ejecutan código administrado en un entorno de tiempo de ejecución conocido como Common Language Runtime (CLR).

CLR

El CLR de .NET es un entorno de ejecución multiplataforma que incluye compatibilidad con Windows, macOS y Linux. CLR controla la asignación y administración de memoria. El CLR es además una máquina virtual que no solo ejecuta aplicaciones, sino que también genera y compila código mediante un compilador Just-In-Time (JIT).

Para obtener más información, vea Información general de Common Language Runtime (CLR).

Compilador JIT y lenguaje intermedio

Los lenguajes .NET de nivel alto, como C#, compilan en un conjunto de instrucciones independiente del hardware, lo que se denomina lenguaje intermedio (IL). Cuando se ejecuta una aplicación, el compilador JIT convierte el lenguaje intermedio en código máquina comprensible para el procesador. La compilación JIT se produce en el mismo equipo en el que se va a ejecutar el código.

Como la compilación JIT tiene lugar durante la ejecución de la aplicación, el tiempo de compilación es parte del tiempo de ejecución. Por tanto, los compiladores JIT tienen que compensar el tiempo invertido en optimizar el código con el ahorro que puede generar el código resultante. Pero un compilador JIT conoce el hardware real y puede liberar a los desarrolladores de tener que enviar diferentes implementaciones para distintas plataformas.

El compilador JIT de .NET puede realizar la compilación en niveles, lo que significa que puede volver a compilar métodos concretos en tiempo de ejecución. Esta característica le permite compilar rápidamente mientras todavía puede generar una versión muy optimizada del código para los métodos que se usan con frecuencia.

Para obtener más información, vea Proceso de ejecución administrada y Compilación en niveles.

Compilador AOT

La experiencia predeterminada para la mayoría de las cargas de trabajo de .NET es el compilador JIT, pero .NET ofrece dos formas de compilación anticipada (AOT):

  • Algunos escenarios requieren una compilación AOT del 100 %. Un ejemplo es iOS.
  • En otros escenarios, la mayor parte del código de una aplicación se compilada mediante AOT, pero otra mediante JIT. Algunos patrones de código no son descriptivos para AOT (como los genéricos). Un ejemplo de este tipo de compilación AOT es la opción de publicación listo para ejecutar. Esta forma de AOT ofrece las ventajas de AOT sin sus inconvenientes.

Administración de memoria automática

El recolector de elementos no utilizados (GC) administra la asignación y liberación de la memoria para las aplicaciones. Cada vez que el código crea un objeto, el CLR le asigna memoria del montón administrado. Siempre que haya espacio de direcciones disponible en el montón nativo, el motor en tiempo de ejecución continúa asignando espacio a los objetos nuevos. Cuando no queda suficiente espacio de direcciones libre, el GC comprueba los objetos del montón administrado que la aplicación ya no usa. Después, reclama esa memoria.

El recolector de elementos no utilizados es uno de los servicios del CLR que ayudan a garantizar la protección de la memoria. Un programa tiene protección de la memoria si tiene acceso solo a la memoria asignada. Por ejemplo, el entorno de ejecución garantiza que una aplicación no accede a memoria sin asignar más allá de los límites de una matriz.

Para obtener más información, vea Administración de memoria automática y Fundamentos de la recolección de elementos no utilizados.

Trabajar con recursos no administrados

En ocasiones el código debe hacer referencia a recursos no administrados. Los recursos no administrados son recursos que el entorno de ejecución .NET no mantiene de forma automática. Por ejemplo, un identificador de archivo es un recurso no administrado. Un objeto FileStream es un objeto administrado, pero hace referencia a un identificador de archivo, que es uno no administrado. Cuando haya acabado de usar FileStream, tiene que liberar de forma explícita el identificador de archivo.

En .NET, los objetos que hacen referencia a recursos no administrados implementan la interfaz de IDisposable. Cuando haya acabado de usar el objeto, deberá llamar al método Dispose() del objeto, que es el responsable de liberar cualquier recurso no administrado. Los lenguajes de .NET proporcionan una práctica instrucción using (C#, F#, VB) que garantiza la llamada al método Dispose.

Para obtener más información, vea Limpieza de recursos no administrados.

Modelos de implementación

Las aplicaciones .NET se pueden publicar en dos modos diferentes:

  • La publicación de una aplicación como independiente genera un archivo ejecutable que incluye el entorno de ejecución y las bibliotecas de .NET, así como la aplicación y sus dependencias. Los usuarios de la aplicación pueden ejecutarla en un equipo que no tenga instalado el entorno de ejecución de .NET. Las aplicaciones independientes son específicas de la plataforma y, opcionalmente, se pueden publicar mediante una forma de compilación AOT.

  • La publicación de una aplicación como dependiente del marco genera un archivo ejecutable y archivos binarios (archivos .dll) que solo incluyen la propia aplicación y sus dependencias. Los usuarios de la aplicación tienen que instalar el entorno de ejecución de .NET por separado. El archivo ejecutable es específico de la plataforma, pero los archivos .dll de las aplicaciones dependientes del marco son multiplataforma.

    Puede instalar varias versiones del tiempo de ejecución en paralelo para ejecutar aplicaciones dependientes del marco destinadas a otras versiones del tiempo de ejecución. Para obtener más información, vea Plataformas de destino.

Los archivos ejecutables se generan para plataformas de destino concretas, que se especifican con un identificador en tiempo de ejecución (RID).

Para obtener más información, vea Información general sobre la publicación de aplicaciones .NET e Introducción a .NET y Docker.

Bibliotecas en tiempo de ejecución

.NET tiene un amplio conjunto estándar de bibliotecas de clases, conocidas como bibliotecas en tiempo de ejecución, bibliotecas de marco o la biblioteca de clases base (BCL). Estas bibliotecas proporcionan implementaciones para muchos tipos de propósito general y específicos de la carga de trabajo, y funcionalidad de la utilidad.

Estos son algunos ejemplos de los tipos definidos en las bibliotecas en tiempo de ejecución de .NET:

Para obtener más información, vea Introducción a las bibliotecas en tiempo de ejecución. El código fuente de las bibliotecas está en el repositorio dotnet/runtime de GitHub.

Extensiones de las bibliotecas en tiempo de ejecución

Las bibliotecas de algunas funcionalidades de aplicación de uso común no se incluyen en las bibliotecas en tiempo de ejecución, sino que están disponibles en paquetes NuGet como los siguientes:

Paquete de NuGet Documentación
Microsoft.Extensions.Hosting Administración de la duración de la aplicación (host genérico)
Microsoft.Extensions.DependencyInjection Inserción de dependencias (ID)
Microsoft.Extensions.Configuration Configuración
Microsoft.Extensions.Logging Logging
Microsoft.Extensions.Options Patrón de opciones

Para obtener más información, vea el repositorio dotnet/extensions en GitHub.

Acceso a datos

.NET proporciona un asignador relacional/de objeto (ORM) y una manera de escribir consultas SQL en el código.

Entity Framework Core

Entity Framework (EF) Core es una tecnología de acceso a datos multiplataforma y de código abierto que puede servir como ORM. EF Core le permite trabajar con una base de datos si hace referencia a los objetos .NET en el código. Reduce la cantidad de código de acceso a datos que, de lo contrario, tendría que escribir y probar. EF Core es compatible con muchos motores de base de datos.

Para obtener más información, vea Entity Framework Core y Proveedores de base de datos.

LINQ

Language Integrated Query (LINQ) permite escribir código declarativo para trabajar en los datos. Los datos pueden estar en muchos formatos (como objetos en memoria, una base de datos SQL o un documento XML), pero el código LINQ que escriba normalmente no es diferente según el origen de datos.

Para obtener más información, vea Información general de LINQ (Language Integrated Query).

Terminología de .NET

Para entender la documentación de .NET, puede ser de ayuda saber cómo ha cambiado el uso de algunos términos con el tiempo.

.NET Core y .NET 5

En 2002, Microsoft publicó .NET Framework, una plataforma de desarrollo para la creación de aplicaciones Windows. En la actualidad, .NET Framework se encuentra en la versión 4.8 y Microsoft todavía la admite.

En 2014, Microsoft comenzó a escribir un sucesor multiplataforma de código abierto para .NET Framework. Esta nueva implementación de .NET se denominó .NET Core hasta que alcanzó la versión 3.1. La versión siguiente después de .NET Core 3.1 es .NET 5. Se omitió el número de versión 4 para evitar la confusión entre esta implementación de .NET y .NET Framework 4.8. El nombre "Core" se quitó para aclarar que ahora esta es la implementación principal de .NET.

Este artículo trata sobre .NET 5, pero en gran parte de la documentación de .NET 5 todavía se incluyen referencias a ".NET Core" o ".NET Framework". Además, "Core" permanece en los nombres ASP.NET Core y Entity Framework Core.

En la documentación también se hace referencia a .NET Standard. .NET Standard es una especificación de API que permite desarrollar bibliotecas de clases para varias implementaciones de .NET.

Para obtener más información, vea Componentes de la arquitectura de .NET.

Términos sobrecargados

Parte de la terminología de .NET puede resultar confusa porque la misma palabra se usa de maneras diferentes en contextos distintos. Estos son algunos de los casos más destacados:

  • motor en tiempo de ejecución

    Context Significado de "runtime"
    Common Language Runtime (CLR) El entorno de ejecución de un programa administrado. El sistema operativo forma parte del entorno de tiempo de ejecución, pero no del tiempo de ejecución de .NET.
    Entorno de ejecución de .NET en la página de descarga de .NET El CLR y las bibliotecas en tiempo de ejecución, que de manera conjunta proporcionan compatibilidad para ejecutar aplicaciones dependientes del marco de trabajo. En la página también se ofrecen opciones de tiempo de ejecución para aplicaciones de servidor de ASP.NET Core y aplicaciones de escritorio de Windows.
    Identificador en tiempo de ejecución (RID) La plataforma del sistema operativo y la arquitectura de la CPU en la que se ejecuta una aplicación .NET. Por ejemplo: Windows x64, Linux x64.
  • marco de trabajo

    Context Significado de "marco"
    .NET Framework La implementación original de .NET, solo para Windows. La "F" de "Framework" está en mayúsculas.
    versión de .NET Framework de destino La colección de API de las que depende una aplicación o biblioteca de .NET. Ejemplos: .NET Core 3.1, .NET Standard 2.0
    Moniker de la plataforma de destino (TFM) TFM es un formato de token normalizado para especificar la plataforma de destino de una aplicación o biblioteca de .NET. Ejemplo: net462 para .NET Framework 4.6.2.
    Aplicación dependiente de la plataforma Una aplicación que solo se puede ejecutar en un equipo en el que se ha instalado el tiempo de ejecución desde la página de descargas de .NET. En este caso, "marco" es lo mismo que el "tiempo de ejecución" que se descarga de la página de descargas de .NET.
    Bibliotecas de marco A veces se usa como sinónimo de las bibliotecas en tiempo de ejecución.
  • SDK

    Context Significado de "SDK"
    SDK en la página de descargas de .NET Una colección de herramientas y bibliotecas que se descargan e instalan para desarrollar y ejecutar aplicaciones .NET. Incluye la CLI, MSBuild, el entorno de tiempo de ejecución de .NET y otros componentes.
    Proyecto de estilo SDK Conjunto de destinos y tareas de MSBuild que especifica cómo compilar un proyecto para un tipo de aplicación concreto. En este sentido, el SDK se especifica mediante el atributo Sdk del elemento Project en un archivo del proyecto.
  • platform

    Context Significado de "plataforma"
    multiplataforma En este término, "plataforma" significa un sistema operativo y el hardware en que se ejecuta, como Windows, macOS, Linux, iOS y Android.
    Plataforma .NET El uso varía. La referencia puede ser una implementación de .NET (como .NET Framework o .NET 5), o bien un concepto general de .NET que incluye todas las implementaciones.
  • CLI

    Acrónimo de Significado
    Interfaz de la línea de comandos Cadena de herramientas multiplataforma que sirve para desarrollar, compilar, ejecutar y publicar aplicaciones .NET.
    Common Language Infrastructure Especificación que CLR implementa.

Para obtener más información sobre la terminología de .NET, vea el Glosario de .NET.

Escenarios avanzados

En las secciones siguientes se explican algunas de las funciones de .NET que son útiles en escenarios avanzados.

Interoperabilidad nativa

Cada sistema operativo incluye una interfaz de programación de aplicaciones (API) que proporciona servicios del sistema. .NET proporciona varias maneras de llamar a esas API.

La principal manera de interoperar con API nativas es a través de la "invocación de plataforma" (o P/Invoke para abreviar). P/Invoke se admite en las plataformas Windows y Linux. Una manera de interoperabilidad nativa exclusiva de Windows se denomina "Interoperabilidad COM", que se usa con componentes COM en código administrado. Se basa en la infraestructura de P/Invoke, pero funciona de forma ligeramente diferente.

Para obtener más información, vea Interoperabilidad nativa.

Código no seguro

Según la compatibilidad con el lenguaje, CLR le permite tener acceso a memoria nativa y usar la aritmética de punteros a través de código unsafe. Estas operaciones son necesarias para determinados algoritmos y para la interoperabilidad del sistema. Aunque es eficaz, se desaconseja el uso de código no seguro a menos que sea necesario para la interoperabilidad con las API del sistema o para implementar el algoritmo más eficaz. Es posible que el código no seguro no se ejecute del mismo modo en entornos diferentes y que también pierda las ventajas de un recolector de elementos no utilizados y de la seguridad de tipos. Se recomienda limitar y centralizar el código no seguro lo máximo posible, y probar el código a conciencia.

Para obtener más información, vea Código no seguro y punteros.

Pasos siguientes