.net core - framework - Calce de compatibilidad utilizado por.NET Standard 2.0
net standard vs net core (1)
Las descripciones generales ( example ) de .NET Standard 2.0 dicen que ahora usa algún tipo de compatibilidad que corrige el problema de compatibilidad de la biblioteca de terceros. Por lo tanto, puede usar la biblioteca de terceros con .NET Standard hasta que no use ninguna API que .NET Standard no tenga.
Lo que no está claro es
- ¿Cómo funciona esta cuña? algún inconveniente?
y
- ¿Cómo verificar que la biblioteca de terceros sea compatible? ¿Al agregarlo directamente al proyecto y luego intentar compilarlo?
Esto funciona creando todas las bibliotecas necesarias a las que hacen referencia las bibliotecas clásicas de .NET.
Por ejemplo, en .NET Core, la implementación de
Object
o
Attribute
se define en
System.Runtime
.
Cuando compila código, el código generado siempre hace referencia al ensamblado y al tipo =>
[System.Runtime]System.Object
.
Sin embargo, los proyectos clásicos de .NET hacen referencia a
System.Object
de
mscorlib
.
Al intentar usar un ensamblado .NET clásico en .NET Core 1.0 / 1.1, esto generalmente conduce a que no se encuentren tipos.
En .NET Core 2.0, habrá tipos "falsos" en un
mscorlib
que el tiempo de ejecución sabe cómo reenviar a donde está realmente la implementación.
Puede leer más sobre cómo funciona esta unificación de ensamblaje en el repositorio dotnet / estándar de GitHub, pero el escenario más importante es este (imagen tomada de este repositorio):
Esto muestra cómo se supone que funciona el escenario: cuando un dll de terceros hace referencia a
[mscorlib]Microsoft.Win32.RegistryKey
, habrá un
mscorlib.dll
que contiene un tipo de reenvío a
[Microsoft.Win32.Registry] Microsoft.Win32.RegistryKey
entonces funcionará cuando un
Microsoft.Win32.RegistryKey.dll
esté presente.
Esto también muestra la desventaja principal: el registro es un concepto exclusivo de Windows y no está disponible en Mac o Linux, por lo que este código en particular puede fallar al ejecutarse en plataformas que no sean Windows. Pero si usa solo partes de la biblioteca que no usan esta funcionalidad, puede funcionar para escenarios multiplataforma.
Otro problema es que incluso si la API está "disponible" para compilar y hacer referencia, aún puede arrojar una
PlatformNotSupportedException
.
Por ejemplo, una biblioteca que implementa un formato de archivo para la serialización / deserialización podría funcionar sin modificación, incluso si se ha creado para .NET Framework 3.5.
Para encontrar qué funciones API usa una biblioteca en particular, el .NET Portability Analyzer se puede usar para escanear un archivo dll y mostrar si la biblioteca es compatible y si no, qué API están bloqueando.