.NET Standard vs .NET Core

240

He leído sobre la diferencia entre .NET Standard y .NET Core, pero realmente no sé cuál es la diferencia, o cuándo elegir un proyecto de biblioteca .NET Standard y cuándo elegir un proyecto de biblioteca .NET Core.

He leído que .NET Standard es para garantizar que un conjunto de API siempre esté disponible, sin importar la plataforma utilizada (siempre que esa plataforma sea compatible con la versión .NET Standard que he elegido). Si no me equivoco, esto significa que puedo crear una biblioteca de clases de .NET Standard y luego usarla en cualquier plataforma que sea compatible con la versión de .NET Standard que he elegido.

Con .NET Core, he leído que también está destinado al uso multiplataforma, por lo que si elijo una biblioteca .NET Core parece que también puedo usarla en muchas plataformas, al igual que .NET Standard.

Entonces, al final, no veo la diferencia. ¿Cuándo debo usar cuál? ¿Cuál es la diferencia entre ellos?

Álvaro García
fuente
33
En términos de código: .net estándar = interfaz, .net core = clase; si codifica contra la clase, puede obtener más métodos (etc.), pero está restringido a ese tipo concreto (y descendientes); si usa la interfaz, puede obtener una superficie más pequeña, pero funcionará contra implementaciones arbitrarias ... siempre que esas implementaciones hagan lo que se espera :) sí, .net core apunta a múltiples plataformas, pero hay otras implementaciones de .net estándar
Marc Gravell
99
.NETStandard es un reemplazo para PCL. Una Biblioteca de clases portátil lo ayudó a escribir una biblioteca que podría ejecutarse en más de una plataforma (teléfono, escritorio, tienda, navegador, xbox, etc.). No escalaba muy bien, sufriendo mucho por la n! problema, así que lo abandonaron. .NETCore es solo el primer marco que hicieron, fue el más fácil, el resto tiene que ponerse al día. Tenga en cuenta que esto es mucho trabajo en progreso, grandes cambios por delante con .NETStandard v2.0. El estándar para gobernarlos a todos, por ahora :)
Hans Passant
No agregue preguntas adicionales a una existente. Su pregunta en la edición está separada de esto.
Jon Skeet
1
@ JonSkeet ¿Entonces debería abrir una nueva pregunta? Gracias por el consejo. porque al principio abrí una nueva consulta sobre .net Core multi target y me rechazaron porque dijeron que era una pregunta duplicada.
Álvaro García
@ ÁlvaroGarcía: Sí, pero que quede claro: su pregunta actual de una oración no me resulta clara en absoluto.
Jon Skeet

Respuestas:

195

Intentaré aclarar más tus dudas y extender la respuesta de Jon Skeet.

.NET Standard es una especificación , por lo que una biblioteca compilada para una versión específica de .NET Standard se puede utilizar en diferentes implementaciones de .NET Standard.

Como dije en mi otro comentario, una buena analogía para la relación entre .NET Standard y otras implementaciones de .NET Standard (.NET Core, .NET Framework, etc.) es esta esencia de David Fowler : las versiones de .NET Standard son Interfaces, mientras que los frameworks son implementaciones de esas interfaces.

Este diagrama simplificado puede ayudar a comprender esta relación:

Analogía de interfaces estándar NET

Cualquier objetivo NetCore10tiene acceso a INetStandard15API y API NetCore10 específicas (como DotNetHostPolicy).

Por supuesto esta biblioteca no se puede utilizar en diferentes INetStandard15implementaciones ( NetCore10no es convertible a NetFramework462o Mono46).

Si, en cambio, necesidad de acceso sólo a INetStandard15las API (y especificación de destino que en lugar de un marco concreto) su biblioteca podrá ser utilizado por cualquier marco que prevé su aplicación ( NetCore10, NetFramework462, etc.)

Nota: en la analogía original, David Fowler utilizaba interfaces para las versiones de .NET Standard y las implementaciones de frameworks. Creo que usar interfaces y clases es, en cambio, más intuitivo y representa mejor la relación entre especificaciones e implementaciones concretas.

Federico Dipuma
fuente
2
Muchas gracias por esto. Pero tengo una duda. Si .net standard es una interfaz y se puede implementar, por ejemplo, con .net framework y .net Core, cuando creo una biblioteca de clases .net standard y uso esta biblioteca en otro proyecto, qué implementación está usando, net framework o .net ¿Núcleo?
Álvaro García
8
Utilizará la implementación de la aplicación compilada (sea lo que sea). Si compila una aplicación principal NET entonces utilizará bibliotecas principales NET (que son una implementación del estándar NET)
Federico Dipuma
55
Ese diagrama es una ayuda fantástica para ilustrar la relación núcleo / estándar / marco.
jaspe
Entonces, si creo una aplicación de consola net461 y apunto a una biblioteca netstandard2.0, nada de esa biblioteca estándar se resuelve en la aplicación de consola. Entonces... ??
Sinaesthetic
2
Una imagen vale más que mil palabras
Nikaas
182

.NET Core es una implementación de .NET Standard. Está disponible en múltiples sistemas operativos, pero eso no es lo mismo: también hay otras implementaciones de .NET Standard.

Por lo tanto, si crea una biblioteca .NET Core, tendrá acceso a las cosas que se implementan en .NET Core, pero que no forman parte de .NET Standard, y su biblioteca no será compatible con otras implementaciones de .NET Standard, como Xamarin, Tizen, full .NET framework de escritorio, etc.

En resumen: para lograr la máxima portabilidad, haga que su biblioteca apunte a .NET Standard.

Jon Skeet
fuente
55
@ ÁlvaroGarcía: ¿Qué quieres decir con "eso" debería ser compatible? .NET Core 1.0? No necesariamente, porque .NET Core 1.0 todavía puede incluir cosas adicionales . Esa entrada significa que si apunta a .NET Standard 1.6, puede ejecutar el código tanto en Mono 4.6 como en .NET Core 1.0.
Jon Skeet
44
No puede ejecutar un ensamblado .NET Core en otra cosa que no sea .NET Core (CoreCLR y CoreFX). Puede ejecutar un ensamblado de .NET Standard en cualquier marco que cumpla con las obligaciones contractuales para el Estándar relevante (1.3, 1.6, 2.0, etc.).
Mark Rendle
2
Multiplataforma se refiere al sistema operativo, no al marco.
Mark Rendle
15
Como analogía, intente imaginar .NET Standard como una interfaz (por ejemplo INetStandard16). .NET Core 1.0 y Mono 4.6 se implementan INetStandard16. No puede convertir .Net Core 1.0 a Mono 4.6 (y viceversa), pero cualquier cosa que use INetStandard16funcionará en ambos. (créditos a David Fowler )
Federico Dipuma
66
Esto me sorprendió Los nombres parecen al revés. Uno pensaría que algo llamado "núcleo" sería el más mínimo de los dos ...
jpmc26
6

La biblioteca .NET Core Class es básicamente un subconjunto de la biblioteca .NET Framework, que solo contiene menos API. Mantenerse en la biblioteca .NET Core Class hace que sea difícil compartir código entre tiempos de ejecución. Es posible que este código no funcione para un tiempo de ejecución diferente (Mono para Xamarin), porque no tiene la API que necesita. Para resolver esto, existe .NET Standard, que es solo un conjunto de especificaciones que le indica qué API puede usar . El objetivo principal de .NET Standard es compartir código entre tiempos de ejecución. Y es importante que esta especificación sea implementada por todos los tiempos de ejecución. (.NET Framework, .NET Core y Mono para Xamarin).

Entonces, si está seguro de que usará su biblioteca solo para proyectos .NET Core, puede ignorar .NET Standard, pero si hay una pequeña posibilidad de que .NET Framework o Mono para Xamarin use su código, entonces es mejor cumplir con el estándar .NET

También tenga en cuenta que las versiones superiores de .NET Standard contienen más API, pero las versiones inferiores son compatibles con más plataformas. Por lo tanto, si crea una biblioteca .NET Standard que desea compartir entre tiempos de ejecución, apunte a la versión más baja que pueda , lo que le ayuda a llegar a la mayoría de las plataformas. Por ejemplo, si desea ejecutar en .NET Framework 4.5 y .NET Core 1.0, la versión más alta de .NET Standard que puede usar es .NET Standard 1.1. Consulte esta gran tabla de la documentación para obtener más información al respecto.

PD: Además, si desea convertir su biblioteca a .NET Standard, .NET Portability Analyzer podría ayudarlo con eso.

usuario2771704
fuente
5

.NET Standard es una especificación de API de .NET destinada a estar disponible en implementaciones de .NET. Esto permite definir un conjunto uniforme de API BCL para todas las implementaciones de .NET.

.NET Core es una de esas implementaciones de .NET Standard. .NET Framework es otra implementación de .NET Standard.

Imagen del blog .NET

ingrese la descripción de la imagen aquí

La respuesta de Federicos le brinda una descripción gráfica de cómo cada marco evoluciona con las versiones. Eche un vistazo al siguiente diagrama de Microsoft Docs .

ingrese la descripción de la imagen aquí

Apuntar a .NET Standard aumenta el soporte de su plataforma, mientras que apuntar a una plataforma .NET particular como .NET Core (o .NET Framework) le permitirá usar todas las funciones de la plataforma para esa plataforma.

Nipuna
fuente
2

.NET Standard es una especificación de API que deben proporcionar todas las implementaciones de .NET. Aporta coherencia a la familia .NET y le permite crear bibliotecas que puede usar desde cualquier implementación de .NET. Reemplaza PCL para construir componentes compartidos.

.NET Core es una implementación del estándar .NET que está optimizado para crear aplicaciones de consola, aplicaciones web y servicios en la nube utilizando ASP.NET Core. Su SDK viene con una herramienta poderosa que, además del desarrollo de Visual Studio, admite un flujo de trabajo de desarrollo basado en línea de comandos completo. Puede obtener más información sobre ellos en aka.ms/netstandardfaq y aka.ms/netcore .


Lo anterior, junto con una explicación muy clara de la mayoría de las cosas discutidas en esta pregunta, se puede encontrar en el siguiente artículo extremadamente útil de Microsoft (MSDN - septiembre de 2017): .NET Standard - Desmitificando .NET Core y .NET Standard

steliosalex
fuente
0

¿Quiso decir .NET Framework? Porque .NET estándar es implementaciones, como .NET Framework, .NET Core y Xamarin.

Me encanta .NET Core porque podemos alojarlo en Linux (use nginx en mi experiencia). Es diferente de .NET framework, que es el único que puede alojar en IIS. Puede considerar el presupuesto de alojamiento en este caso (porque el servidor de Windows es caro para mí).

En la perspectiva del entorno de desarrollo , .Net core es ligero. Por lo tanto, puede usar VSCode, Sublime, para IDE (no solo visual studio).

Fityan Aula
fuente
0

En términos simples, el estándar .NET se usa para escribir proyectos de biblioteca de clases que se compilan en dll. .NET Core se puede usar para desarrollar aplicaciones web reales que se pueden ejecutar en todos los sistemas operativos (Windows, Linux, MacOS). (En .NET Core 3, Microsoft ha proporcionado la funcionalidad para desarrollar aplicaciones de escritorio usando WPF, pero hasta ahora estas aplicaciones no serán multiplataforma y solo se ejecutarán en el sistema de Windows. En el futuro, Microsoft también podría hacerlas multiplataforma) .NET estándar Las bibliotecas / dlls se pueden usar en cualquier aplicación que use .NET (.NET framework, .NET Core), lo que significa que puede usar el estándar .NET con .NET framework y .NET core.

Waleed Naveed
fuente