Оболочка совместимости, используемая в.NET Standard 2.0

В обзорах ( пример).NET Standard 2.0 говорится, что теперь он использует какую-то оболочку совместимости, которая устраняет проблему совместимости сторонних библиотек. Таким образом, вы можете использовать стороннюю библиотеку с.NET Standard, пока она не использует API, которого нет в.NET Standard.

Что не ясно, так это

  • как работает эта прокладка? какие-нибудь недостатки?

а также

  • как проверить, что сторонняя библиотека поддерживается? Путем непосредственного добавления его в проект, а затем пытаться скомпилировать?

1 ответ

Решение

Это работает путем создания всех необходимых библиотек, на которые ссылаются классические библиотеки.NET.

Например, в.NET Core реализация Object или же Attribute определяется в System.Runtime, Когда вы компилируете код, сгенерированный код всегда ссылается на сборку и тип => [System.Runtime]System.Object, Классические.NET проекты однако ссылки System.Object от mscorlib, При попытке использовать классическую сборку.NET в.NET Core 1.0/1.1 это обычно приводит к тому, что типы не обнаруживаются. В.NET Core 2.0 будут "поддельные" типы в mscorlib что среда выполнения знает, как пересылать туда, где на самом деле находится реализация.

Вы можете прочитать больше о том, как это объединение сборок работает в репозитории dotnet/standard GitHub, но наиболее важный сценарий таков (изображение взято из этого репозитория):

Mscorlib фасад

Это показывает, как сценарий должен работать: когда сторонние dll ссылаются [mscorlib]Microsoft.Win32.RegistryKey будет mscorlib.dll который содержит тип вперед [Microsoft.Win32.Registry] Microsoft.Win32.RegistryKey так что это будет работать, когда Microsoft.Win32.RegistryKey.dll настоящее.

Это также показывает главный недостаток: Реестр является концепцией только для Windows и недоступен на Mac или Linux, поэтому этот конкретный код может не работать на платформах, отличных от Windows. Но если вы используете только те части библиотеки, которые не используют эту функциональность, это может работать для кроссплатформенных сценариев.

Другая проблема заключается в том, что даже если API "доступен" для компиляции и ссылки, он все равно может выдать PlatformNotSupportedException,

Например, библиотека, которая реализует формат файла для сериализации / десериализации, может работать без изменений, даже если она была построена для.NET Framework 3.5.

Чтобы выяснить, какие функции API использует конкретная библиотека, можно использовать анализатор переносимости.NET для сканирования библиотеки DLL и показать, совместима ли библиотека, а если нет, то какие API блокируют.

Другие вопросы по тегам