Общие сведения о коде общего доступа
В этом документе сравниваются различные методы совместного использования кода между кроссплатформенными проектами: .NET Standard, общими проектами и переносимыми библиотеками классов, включая преимущества и недостатки каждого из них.
Существует три метода совместного использования кода между кроссплатформенными приложениями:
- Библиотеки .NET Standard — проекты .NET Standard могут реализовать код для совместного использования на нескольких платформах и получить доступ к большому количеству API .NET (в зависимости от версии). .NET Standard 1.0 — 1.6 реализует постепенно большие наборы API, а .NET Standard 2.0 обеспечивает лучшее покрытие BCL .NET (включая API .NET, доступные в приложениях Xamarin).
- Общие проекты — используйте тип проекта общего ресурса для упорядочивания исходного кода и используйте
#if
директивы компилятора, необходимые для управления требованиями для конкретной платформы. - Переносимые библиотеки классов (нерекомендуемые) — переносимые библиотеки классов (PCLs) могут использовать несколько платформ с общей поверхностью API и использовать интерфейсы для предоставления функциональных возможностей для конкретной платформы. PcLs устарели в последних версиях Visual Studio. Вместо этого используйте .NET Standard.
Цель стратегии совместного использования кода — поддерживать архитектуру, показанную на этой схеме, где одна база кода может использоваться несколькими платформами.
В этой статье сравниваются методы, доступные для выбора подходящего типа проекта для приложений.
Библиотеки .NET Standard
Библиотеки .NET Standard предоставляют четко определенный набор библиотек базовых классов, на которые можно ссылаться в различных типах проектов, включая кроссплатформенные проекты, такие как Xamarin.Android и Xamarin.iOS. Для обеспечения максимальной совместимости с существующим кодом платформа .NET Framework рекомендуется использовать .NET Standard 2.0.
Льготы
- Позволяет совместно использовать код в нескольких проектах.
- Операции рефакторинга всегда обновляют все затронутые ссылки.
- Более большая область поверхности библиотеки базовых классов .NET (BCL) доступна, чем профили PCL. В частности, .NET Standard 2.0 имеет почти ту же поверхность API, что и платформа .NET Framework и рекомендуется для новых приложений и переноса существующих PCLs.
Недостатки
- Не удается использовать такие
#if __IOS__
директивы компилятора.
Замечания
.NET Standard аналогичен PCL, но с более простой моделью для поддержки платформы и большим количеством классов из BCL.
Общие проекты
Общие проекты содержат файлы кода и ресурсы, включенные в любой проект, ссылающийся на них. Совместное использование проектов не создает скомпилированные выходные данные самостоятельно.
Снимок экрана: файл решения, содержащий три проекта приложения (для Android, iOS и Windows), с общим проектом, содержащим общие файлы исходного кода C#:
Концептуальная архитектура показана на следующей схеме, где каждый проект включает все общие исходные файлы:
Пример
Кроссплатформенное приложение, поддерживающее iOS, Android и Windows, потребует проекта приложения для каждой платформы. Общий код находится в общем проекте.
Пример решения будет содержать следующие папки и проекты (имена проектов были выбраны для выражения, проекты не должны соответствовать этим рекомендациям по именованию):
- Общий — общий проект, содержащий код, общий для всех проектов.
- AppAndroid — проект приложения Xamarin.Android.
- AppiOS — проект приложения Xamarin.iOS.
- AppWindows — проект приложения Windows.
Таким образом, три проекта приложения совместно используют один и тот же исходный код (файлы C# в shared). Все изменения в общем коде будут совместно использоваться во всех трех проектах.
Льготы
- Позволяет совместно использовать код в нескольких проектах.
- Общий код можно ветвить на основе платформы с помощью директив компилятора (например, использование
#if __ANDROID__
, как описано в документе "Сборка кроссплатформенных приложений "). - Проекты приложений могут включать ссылки на платформы, которые могут использовать общий код (например, использование
Community.CsharpSqlite.WP7
в примере задачи для Windows Телефон).
Недостатки
- Рефакторинги, влияющие на код внутри директив компилятора inactive, не будут обновлять код внутри этих директив.
- В отличие от большинства других типов проектов, общий проект не имеет сборки output. Во время компиляции файлы обрабатываются как часть проекта ссылки и компилируются в этой сборке. Если вы хотите предоставить общий доступ к коду в качестве сборки, то библиотеки классов .NET Standard или Переносимые классы являются лучшим решением.
Замечания
Хорошее решение для разработчиков приложений, написав код, предназначенный только для совместного использования в приложении (а не для других разработчиков).
Переносимые библиотеки классов
Совет
Библиотеки .NET Standard 2.0 рекомендуется использовать для переносимых библиотек классов.
Здесь подробно рассматриваются переносимые библиотеки классов.
Льготы
- Позволяет совместно использовать код в нескольких проектах.
- Операции рефакторинга всегда обновляют все затронутые ссылки.
Недостатки
- Вместо этого рекомендуется использовать нерекомендуемые в последних версиях библиотек Visual Studio .NET Standard. Обратитесь к этому объяснению различий между PCL и .NET Standard.
- Не удается использовать директивы компилятора.
- Доступно только подмножество платформы .NET, определенное выбранным профилем (дополнительные сведения см. в разделе "Введение в PCL ").
Замечания
Шаблон PCL считается устаревшим в последних версиях Visual Studio.
Итоги
Выбранная стратегия совместного использования кода будет управляться целевыми платформами. Выберите метод, который лучше всего подходит для проекта.
.NET Standard — это лучший выбор для создания библиотек кодов для совместного использования (особенно для публикации в NuGet). Общие проекты хорошо работают для разработчиков приложений, планирующих использовать множество функциональных возможностей платформы в кроссплатформенных приложениях.
Хотя проекты PCL по-прежнему поддерживаются в Visual Studio, для новых проектов рекомендуется использовать .NET Standard.