¿Cuál es la diferencia entre los tipos de proyectos .NET Core y .NET Standard Class Library?
En Visual Studio, existen al menos tres tipos diferentes de bibliotecas de clases que puede crear:
- Biblioteca de clases (.NET Framework)
- Biblioteca de clases (estándar .NET)
- Biblioteca de clases (.NET Core)
Si bien el primero es el que hemos estado usando durante años, un punto importante de confusión que he tenido es cuándo usar los tipos de biblioteca de clases .NET Standard y .NET Core. Esto me ha afectado recientemente cuando intenté apuntar a diferentes versiones del marco y crear un proyecto de prueba unitaria .
Entonces, ¿cuál es la diferencia entre la biblioteca de clases (.NET Standard) y la biblioteca de clases (.NET Core) , por qué existen ambas y cuándo deberíamos usar una sobre la otra?
¿Cuándo deberíamos utilizar uno sobre el otro?
La decisión es una compensación entre compatibilidad y acceso a API.
Utilice una biblioteca .NET Standard cuando desee aumentar la cantidad de aplicaciones que serán compatibles con su biblioteca y esté de acuerdo con una disminución en el área de superficie de la API .NET a la que su biblioteca puede acceder.
Utilice una biblioteca .NET Core cuando desee aumentar el área de superficie de la API .NET a la que puede acceder su biblioteca y esté de acuerdo con permitir que solo las aplicaciones .NET Core sean compatibles con su biblioteca.
Por ejemplo, una biblioteca destinada a .NET Standard 1.3 será compatible con aplicaciones destinadas a .NET Framework 4.6, .NET Core 1.0, Universal Windows Platform 10.0 y cualquier otra plataforma que admita .NET Standard 1.3. Sin embargo, la biblioteca no tendrá acceso a algunas partes de la API .NET. Por ejemplo, el Microsoft.NETCore.CoreCLR
paquete es compatible con .NET Core, pero no con .NET Standard.
¿Cuál es la diferencia entre la biblioteca de clases (.NET Standard) y la biblioteca de clases (.NET Core)?
Compatibilidad: las bibliotecas destinadas a .NET Standard se ejecutarán en cualquier entorno de ejecución compatible con .NET Standard, como .NET Core, .NET Framework, Mono / Xamarin . Por otro lado, las bibliotecas dirigidas a .NET Core solo pueden ejecutarse en el tiempo de ejecución de .NET Core.
Área de superficie API: las bibliotecas .NET Standard vienen con todo en .NET NETStandard.Library
Core, mientras que las bibliotecas .NET Core vienen con todo en Microsoft.NETCore.App
. Este último incluye aproximadamente 20 bibliotecas adicionales, algunas de las cuales podemos agregar manualmente a nuestra biblioteca .NET Standard (como System.Threading.Thread
) y otras no son compatibles con .NET Standard (como Microsoft.NETCore.CoreCLR
).
Además, las bibliotecas .NET Core especifican un tiempo de ejecución y vienen con un modelo de aplicación. Esto es importante, por ejemplo, para que las bibliotecas de clases de pruebas unitarias sean ejecutables.
¿Por qué existen ambos?
Haciendo caso omiso de las bibliotecas por un momento, la razón por la que existe .NET Standard es por la portabilidad; define un conjunto de API que las plataformas .NET aceptan implementar. Cualquier plataforma que implemente un estándar .NET es compatible con bibliotecas destinadas a ese estándar .NET. Una de esas plataformas compatibles es .NET Core.
Volviendo a las bibliotecas, las plantillas de biblioteca .NET Standard existen para ejecutarse en múltiples tiempos de ejecución (a expensas del área de superficie de la API). Por el contrario, las plantillas de biblioteca .NET Core existen para acceder a una mayor superficie de API (a expensas de la compatibilidad) y para especificar una plataforma sobre la cual construir un ejecutable.
Aquí hay una matriz interactiva que muestra qué estándar .NET admite qué implementación(es) .NET y cuánta superficie de API está disponible.
Una biblioteca de clases de .NET Core se basa en .NET Standard . Si desea implementar una biblioteca que sea portátil para .NET Framework , .NET Core y Xamarin , elija una biblioteca .NET Standard
.NET Core finalmente implementará .NET Standard 2 (al igual que Xamarin y .NET Framework )
Por lo tanto, .NET Core , Xamarin y .NET Framework pueden identificarse como versiones de .NET Standard.
Para preparar sus aplicaciones para el futuro para compartir y reutilizar código, preferiría implementar bibliotecas .NET Standard.
Microsoft también recomienda utilizar .NET Standard en lugar de bibliotecas de clases portátiles .
Para citar a MSDN como fuente autorizada, .NET Standard pretende ser una biblioteca para gobernarlos a todos . Como las imágenes valen más que mil palabras, lo siguiente te dejará las cosas muy claras:
1. Su escenario de aplicación actual (fragmentado)
Como la mayoría de nosotros, probablemente se encuentre en la siguiente situación: (aplicaciones con sabor a .NET Framework, Xamarin y ahora .NET Core)
2. Qué le permitirá la biblioteca estándar .NET (compatibilidad entre sistemas)
La implementación de una biblioteca estándar .NET permite compartir código en todos estos tipos diferentes:
Para los impacientes:
- .NET Standard resuelve el problema de compartir código para los desarrolladores de .NET en todas las plataformas al brindar todas las API que espera y ama en los entornos que necesita: aplicaciones de escritorio, aplicaciones y juegos móviles y servicios en la nube:
- .NET Standard es un conjunto de API que todas las plataformas .NET deben implementar . Esto unifica las plataformas .NET y evita futuras fragmentaciones .
- .NET Standard 2.0 será implementado por .NET Framework , . NET Core y Xamarin . Para .NET Core , esto agregará muchas de las API existentes que se han solicitado.
- .NET Standard 2.0 incluye una corrección de compatibilidad para los archivos binarios de .NET Framework , lo que aumenta significativamente el conjunto de bibliotecas a las que puede hacer referencia desde sus bibliotecas de .NET Standard.
- .NET Standard reemplazará a las bibliotecas de clases portátiles (PCL) como herramientas para crear bibliotecas .NET multiplataforma.
Para obtener una tabla que le ayude a comprender cuál es la versión más alta de .NET Standard a la que puede acceder, según las plataformas .NET en las que desea ejecutar, diríjase aquí .
Fuentes: MSDN: Presentación del estándar .NET
La respuesta corta sería:
IAnimal == .NetStandard (General)
ICat == .NetCore (Less general)
IDog == .NetFramework (Specific / oldest and has the most features)