Это работает путем создания всех необходимых библиотек, на которые ссылаются классические библиотеки .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 / стандартный репозиторий GitHub, но наиболее важный сценарий (изображение взято из этого репозитория):
Это показывает, как сценарий должен работать: когда сторонняя 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 Portability Analyzer. dll и покажите, совместима ли библиотека, а если нет, какие API блокируют.
person
Martin Ullrich
schedule
12.06.2017