c# - ¿Cuál es la diferencia entre.NET Core y PCLs?
cross-platform portable-class-library (2)
Hay una hermosa serie de artículos que resolvieron mis preguntas a su alrededor ...
https://oren.codes/2015/06/16/demystifying-pcls-net-core-dnx-and-uwp-redux/ https://oren.codes/2015/07/29/targeting-net-core/
.Net Core tiene todas sus bibliotecas (por ejemplo, System.IO) en paquetes NuGet separados (cada uno de ellos disponible para los SDKs DNX, UWP y .Net 4.6). Las bibliotecas de terceros se dirigen a dnxcore50
(DNX) o uap10.0
(UWP) si acceden a la plataforma de forma nativa o dependen de sus características. Si no acceden a la plataforma pero solo confían en otros paquetes, deberían apuntar a dotnet
.
dotnet
significa efectivamente: soy compatible con cualquier plataforma que satisfaga mis dependencias (su biblioteca XYZ "dotnet" que usa System.Reflection dnxcore5+net45
no pudo ser utilizada por una aplicación UWP uap10.0
). Esto acaba efectivamente con la pesadilla combinatoria de las plataformas. La combinación de objetivos anterior dnxcore5+net45
creó una intersección entre las bibliotecas de las plataformas y cada adición empeoraría la situación. dotnet
en el otro lado no restringe la biblioteca en un destino, sino que reenvía esta decisión de restricción a sus dependencias (donde de repente pueden aparecer nuevas restricciones como la famosa plataforma de unicorn
).
Por lo tanto, como autor de bibliotecas, puede apuntar a dotnet
si solo necesita otras bibliotecas.
Respondiendo tu pregunta:
- Su PCL es compatible con entornos de estilo .Net Core como DNX y UWP si agrega la
dnxcore50
destino,dnxcore50
ouap10.0
destino, según la necesidad de su biblioteca (consulte el artículo de Owen para ver la misma compatibilidad básica con el perfil de contrato 259). - .Net Core es mucho más que un conjunto de bibliotecas PCLed. Es un nuevo CLR, un nuevo marco organizado (empaquetado en partes pequeñas) y la infraestructura para los nuevos .Net SDK (DNX, UWP y lo que sea que se presente). El término ".Net Core" se dirige tanto a la biblioteca de clases base "CoreFx" como al CLR "CoreCLR". Pero las plataformas reales son en realidad DNX (por el equipo de ASP.Net) y UWP (por el equipo de Windows).
Toda esa respuesta es mi comprensión actual de la situación de la biblioteca .Net Core. Es un trabajo en progreso, y como se menciona en las publicaciones, aún no está documentado públicamente.
NOTA DE 2016: tenga en cuenta que netstandard1.x
, como el antecesor de netstandard1.x
ha cambiado su concepto a partir de netstandard2.x
(.NET Core 2.0; ~ JUN 2017). A partir de netstandard2.0
, habrá un contrato común (netstandard.dll) que implementarán todas las plataformas (.NET Core, .NET Framework, Xamarin, Mono, Unity3D). Este contrato se extenderá a lo largo del tiempo y la plataforma tendrá que abandonar el soporte para el último estándar, lanzar la excepción NotImplementedException o implementarlo.
Hace poco escribí las plataformas compatibles para mi PCL, una de las cuales es otra PCL. Estaba confundido si mi biblioteca (que apunta a .NET Framework 4.5 y Windows / Phone 8.1) también se puede usar en proyectos de .NET Core.
Según tengo entendido, los PCL te permiten compartir código en múltiples plataformas sin recompilación, mientras que .NET Core también lo hace. La única diferencia es que .NET Core apunta a unas pocas plataformas más, es decir, OS X y Linux, y es de código abierto.
Básicamente, no veo que .NET Core sea diferente a Microsoft que cambia el nombre de PCL y dice "¡ ATENCIÓN PAGA que vamos a ser de código abierto y nos dirigimos a plataformas que no sean de Windows!"
Entonces, la conclusión es, ¿son compatibles los PCL con .NET Core y viceversa? ¿Cual es la diferencia entre ellos?
Mi entendimiento es que ambos son diferentes en concepto.
- .NET Portable se basa en .NET Full, .NET Core, Windows Phone, etc., como una especie de "capa puente".
- En realidad no tiene una implementación concreta, considérelo un ''Paquete'' de ensamblajes de las ''Interfaces'' (contratos).
- El alcance del ''Paquete'' Portátil .NET es dinámico, depende de qué plataformas de ''Objetivos'' se van a ''vincular''. Es una intersección de las plataformas a las que te diriges, cuantas más plataformas el paquete más pequeño.
- Durante el tiempo de ejecución, esta capa portátil se engancha / adapta a la implementación real de .NET completo, .net core o ...