Estándar .NET, .Net Core, PCL

Estoy completamente confundido por toda esta charla sobre .Net Standard. En cierto sentido, la idea de una biblioteca estándar de .NET suena genial. Noté que en la galería de NuGet, puede elegir .NET Standard para muchas plataformas (por ejemplo, Silverlight). Pero eso me confunde al infierno. ¿Es .NET estándar una biblioteca? ¿O un formato DLL?

De todos modos, ahora hay proyectos .NET Core, así como los proyectos PCL antiguos, pero no veo ninguna plantilla de Visual Studio para .NET Standard. Sin embargo, encontré que si ingresa a la configuración del proyecto, puede cambiar una biblioteca PCL existente a .NET Standard.

De todos modos, la pregunta básica que me pregunto es a qué tipo de biblioteca debemos dirigirnos. Principalmente hago esto para proyectos Xamarin, pero sería genial si pudiéramos compartir estas bibliotecas con otras plataformas, especialmente .NET Core y UWP.

Pero, estoy realmente confundido en cuanto a por qué Microsoft ha sacado al mismo tiempo dos tipos de bibliotecas aparentemente idénticas: .NET Core y .NET Standard.

EDIT: Ahora estoy mucho menos confundido acerca de esto. He editado la publicación original porque todavía no he respondido completamente mi propia pregunta. Aquí está lo que creo que es la clave para entender estas cosas. Estoy abierto a correcciones aquí.

Definiciones

NET Core : un entorno de tiempo de ejecución basado en .NET que se ajusta a la definición de API estándar de .NET.

PCL : un formato de biblioteca basado en .NET compatible con varios entornos de tiempo de ejecución, incluidos .NET, Mono, Windows Phone, etc.

Estándar .NET (Definición 1) – Un conjunto de definiciones de API estándar para entornos de ejecución basados ​​en .NET

Estándar .NET (Definición 2) : un formato de biblioteca basado en .NET compatible con varios entornos de ejecución, incluidos .NET, Mono, Windows Phone, etc., que es una continuación del formato PCL. En Visual Studio, una biblioteca PCL se puede convertir en una biblioteca estándar .NET yendo a las propiedades del proyecto y editando el marco de destino.

Los documentos en torno a esto son ciertamente confusos, pero se puede entender de esta manera:

  • PCL: bibliotecas que se dirigen a un conjunto de plataformas (tienen el ‘denominador menos común’ de las API de esas plataformas). Así que cuando escribes un PCL estás diciendo que quiero apuntar a la plataforma A, B, C

  • .NET estándar: un conjunto ‘estándar’ de API en lugar de una plataforma. Básicamente, no le importan las plataformas, solo el estándar (versión 1.3, 1.6 …) y su código funcionará en todas las plataformas que lo admitan.

  • El núcleo de .NET no debe confundirse aquí, es “otra versión” del marco .NET. El estándar .NET funcionará en tiempo de ejecución cruzado (.NET framework, .NET core, Mono)

Así que supongo que el estándar .NET es el camino a seguir 🙂

Creo que este recurso responde a la mayoría de sus preguntas:

https://docs.microsoft.com/en-us/dotnet/articles/standard/library

La biblioteca estándar de .NET es una especificación formal de las API de .NET que están destinadas a estar disponibles en todos los tiempos de ejecución de .NET. La motivación detrás de la biblioteca estándar es establecer una mayor uniformidad en el ecosistema .NET.

Así que, según tengo entendido, los otros tipos de bibliotecas son específicos de la plataforma y el estándar .NET es, hasta cierto punto, independiente de la plataforma.

Si desea que su código esté disponible en diferentes plataformas, el estándar .NET parece ideal, pero preste mucha atención a la versión del estándar .NET que admiten las otras plataformas (consulte la tabla en el enlace).

Espero que esto ayude

Esto de Samuel Englard ( https://github.com/dotnet/corefx/issues/973#issuecomment-249582799 ):

Las DLL de .NET están formateadas de acuerdo con ECMA-335 (Mejor conocida como Common Language Infrastructure). Este formato es cierto en todas las plataformas que llamamos .NET; Marco completo, Core, Xamarin, Mono, Silverlight, etc.

La razón por la que no podía usar una DLL comstackda en una plataforma con otra era que el formato no especificaba las API (en general). Entonces, si bien todos podrían leer la DLL, se encontraría con problemas de clase XYZ en el espacio de nombres ABC en una plataforma y en el espacio de nombres DEF en otra, si es que existía.

Los PCL “resolvieron” esto haciendo dos cosas:

Utilizaron el reenvío de tipos para que, aunque escribiera su código esperando la clase XYZ en el espacio de nombres ABC, pudiera encontrarse en plataformas que lo tuvieran en otro lugar. Limitó las API que podría usar al conjunto común más bajo compartido por todas las plataformas que deseaba.

Tomar un PCL y convertirlo en un proyecto estándar .NET no es una recomstackción debido al formato de salida, sino a los metadatos incluidos (en particular, el reenvío de tipos).

Por lo tanto, creo que, en esencia, las bibliotecas estándar de .NET no son diferentes de las bibliotecas PCL, excepto por el hecho de que colocan una capa en la parte superior de un conjunto estandarizado diferente de API, y esas API pueden implementar diferentes punteros (reenvío de tipos).

.NET Core es, por supuesto, un entorno de tiempo de ejecución, pero creo que está muy estrechamente alineado con .NET Standard. No creo que tenga ninguna relación especial con él, aparte del hecho de que implementa las API estándar de .NET.

Consulte este glosario: https://github.com/dotnet/corefx/blob/master/Documentation/project-docs/glossary.md

Estándar es para apuntar a un conjunto específico de API similar a las versiones de Android API. La biblioteca nuget es solo un paquete meta que contiene todas las bibliotecas que confirman el estándar.

Scott Hunter en el show de MSDEV ha explicado muy bien este concepto. Vale la pena echarle un vistazo: http://msdevshow.com/2016/07/dot-net-core-with-scott-hunter/