.NET Standard frente a .NET Core

268

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 asegurar que un conjunto de API estén siempre disponibles, 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 .NET Standard que he elegido.

Con .NET Core, he leído que también está diseñado para 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?

7
  • 37
    En términos de código: .net estándar = interfaz, .net core = clase; si codifica contra la clase, es posible que obtenga 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
    20 de mayo de 2017 a las 11:59
  • 9
    .NETStandard es un reemplazo de 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, computadora de escritorio, tienda, navegador, xbox, etc.). No escaló muy bien, sufriendo mucho por el n! problema, por lo 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 :) 20 de mayo de 2017 a las 12:45
  • No agregue preguntas adicionales a una existente. Su pregunta en la edición es independiente de esto. 21 de mayo de 2017 a las 10:02
  • 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 han rechazado porque dijeron que es una pregunta duplicada. 21 de mayo de 2017 a las 11:03
  • @ ÁlvaroGarcía: Sí, pero déjelo claro, su pregunta actual de una frase no me queda clara en absoluto. 21 de mayo de 2017 a las 11:06
210

Intentaré aclarar aún más sus 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 se puede convertir en NetFramework462ni 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 usó interfaces tanto para las versiones .NET Standard como para 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.

8
  • 2
    Muchas gracias por esto. Pero tengo una duda. Si .net estándar es una interfaz y se puede implementar, por ejemplo, con .net framework y .net Core, cuando creo una biblioteca de clases estándar .net y uso esta biblioteca en otro proyecto, qué implementación está usando, net framework o .net ¿Centro? 20 de mayo de 2017 a las 18:10
  • 8
    Utilizará la implementación de la aplicación compilada (cualquiera que sea). Si compila una aplicación NET core, utilizará las bibliotecas NET core (que son una implementación del estándar NET) 20 de mayo de 2017 a las 18:19
  • 5
    Ese diagrama es una ayuda fantástica para ilustrar la relación núcleo / estándar / marco.
    jasper
    10 de agosto de 2017 a las 17:08
  • 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. Tan... ?? 30/08/17 a las 18:45
  • 2
    Una imagen vale mas que mil palabras
    Nikaas
    4 oct 2018 a las 12:20
192

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

Entonces, si crea una biblioteca .NET Core, tendrá acceso a cosas que están implementadas en .NET Core, pero que no son parte de .NET Standard, y su biblioteca no será compatible con otras implementaciones de .NET Standard, como Xamarin, Tizen, marco de escritorio completo .NET, etc.

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

10
  • 5
    @ ÁlvaroGarcía: ¿Qué quiere decir con "eso" debe ser compatible? ¿.NET Core 1.0? No necesariamente, porque .NET Core 1.0 aún puede incluir cosas adicionales . Esa entrada significa que si tiene como destino .NET Standard 1.6, puede ejecutar el código tanto en Mono 4.6 como en .NET Core 1.0. 20 de mayo de 2017 a las 11:47
  • 4
    No puede ejecutar un ensamblado de .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.). 20 de mayo de 2017 a las 11:55
  • 2
    La multiplataforma se refiere al sistema operativo, no al marco. 20 de mayo de 2017 a las 11:55
  • 15
    Como analogía, intente imaginar .NET Standard como una interfaz (por ejemplo INetStandard16). .NET Core 1.0 y Mono 4.6 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 ) 20 de mayo de 2017 a las 11:56
  • 6
    Esto me sorprendió. Los nombres parecen al revés. Pensarías que algo llamado "núcleo" sería el más mínimo de los dos ...
    jpmc26
    21 de mayo de 2017 a las 5:39
9

.NET Standard es una especificación de las API de .NET destinada a estar disponible en implementaciones de .NET. Esto permite definir un conjunto uniforme de API de 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 de .NET

ingrese la descripción de la imagen aquí

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

ingrese la descripción de la imagen aquí

Targeting .NET Standard increases your platform support whereas targeting a particular .NET platform such as .NET Core (or .NET Framework) will allow you to use all the platform features for that platform.

6

La biblioteca .NET Core Class es básicamente un subconjunto de la biblioteca .NET Framework, que solo contiene menos API. Apegarse a la biblioteca de clases de .NET Core dificulta 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 todos los tiempos de ejecución implementen esta especificació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 existe una pequeña posibilidad de que su código sea utilizado por .NET Framework o Mono para Xamarin, entonces es mejor para adherirse a .NET Standard

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, elija la versión más baja que pueda , lo que le ayudará a llegar a la mayoría de las plataformas. Por ejemplo, si desea ejecutar .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 excelente 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.

2

.NET Standard is a specification of APIs that all .NET implementations must provide. It brings consistency to the .NET family and enables you to build libraries you can use from any .NET implementation. It replaces PCLs for building shared components.

.NET Core is an implementation of the .NET Standard that’s optimized for building console applications, Web apps and cloud services using ASP.NET Core. Its SDK comes with a powerful tooling that in addition to Visual Studio development supports a full command line-based development workflow. You can learn more about them at aka.ms/netstandardfaq and 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

1

En términos simples, el estándar .NET se utiliza para escribir proyectos de biblioteca de clases que se compilan en dll. .NET Core se puede utilizar para desarrollar aplicaciones web reales que pueden ejecutarse 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 Windows. En el futuro, Microsoft podría hacerlas multiplataforma también) .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 .NET estándar con .NET framework y .NET core.

0

¿Quiso decir .NET Framework? Porque .NET estándar es una implementación, como .NET Framework, .NET Core y Xamarin.

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

En la perspectiva del entorno de desarrollo , .Net core es liviano. Entonces, puede usar VSCode, Sublime, para IDE (no solo Visual Studio).