Общие сведения о коде для общего доступа

В этом документе сравниваются различные методы совместного использования кода между кроссплатформенными проектами: .NET Standard, общие проекты и переносимые библиотеки классов, включая преимущества и недостатки каждого из них.

Существует три метода совместного использования кода между кроссплатформенными приложениями:

  • Библиотеки .NET Standard — проекты .NET Standard могут реализовывать код для совместного использования на нескольких платформах и получать доступ к большому количеству API.NET (в зависимости от версии). .NET Standard 1.0–1.6 реализуют все более крупные наборы API, а .NET Standard 2.0 обеспечивает наилучшее покрытие .NET BCL (включая API-интерфейсы .NET, доступные в приложениях Xamarin).
  • Общие проекты — используйте тип проекта общего ресурса для организации исходного кода и #if директивы компилятора, необходимые для управления требованиями конкретной платформы.
  • Переносимые библиотеки классов (нерекомендуемые) — переносимые библиотеки классов (PCL) могут ориентироваться на несколько платформ с общей поверхностью API и использовать интерфейсы для предоставления функций для конкретных платформ. Библиотеки PCL являются устаревшими в последних версиях Visual Studio. Вместо этого используйте .NET Standard.

Целью стратегии совместного использования кода является поддержка архитектуры, показанной на этой схеме, где одна база кода может использоваться несколькими платформами.

Архитектура приложения с общим кодом

В этой статье сравниваются методы, которые помогут вам выбрать подходящий тип проекта для приложений.

Библиотеки .NET Standard

Библиотеки .NET Standard предоставляют четко определенный набор библиотек базовых классов, на которые можно ссылаться в различных типах проектов, включая кроссплатформенные проекты, такие как Xamarin.Android и Xamarin.iOS. Для максимальной совместимости с существующим кодом платформа .NET Framework рекомендуется .NET Standard 2.0.

Схема .NET

Преимущества

  • Позволяет совместно использовать код в нескольких проектах.
  • Операции рефакторинга всегда обновляют все затронутые ссылки.
  • Для библиотеки базовых классов .NET (BCL) доступна более широкая контактная зона, чем профили PCL. В частности, .NET Standard 2.0 имеет практически ту же область API, что и платформа .NET Framework и рекомендуется для новых приложений и переноса существующих библиотек PCL.

Недостатки

  • Невозможно использовать директивы компилятора, такие как #if __IOS__.

Комментарии

.NET Standard похожа на PCL, но с более простой моделью для поддержки платформы и большим количеством классов из BCL.

Общие проекты

Общие проекты содержат файлы кода и ресурсы, включенные в любой проект, который ссылается на них. Проекты общего доступа не создают скомпилированные выходные данные самостоятельно.

На снимках экрана показан файл решения, содержащий три проекта приложения (для Android, iOS и Windows) с общим проектом, содержащим общие файлы исходного кода C#:

Решение общего проекта

Концептуальная архитектура показана на следующей схеме, где каждый проект включает все общие исходные файлы:

Схема общего проекта

Пример

Кроссплатформенное приложение, поддерживающее iOS, Android и Windows, потребует проекта приложения для каждой платформы. Общий код находится в общем проекте.

Пример решения будет содержать следующие папки и проекты (имена проектов были выбраны для выразительности, проекты не должны следовать этим рекомендациям по именованию):

  • Shared — общий проект, содержащий код, общий для всех проектов.
  • AppAndroid — проект приложения Xamarin.Android.
  • AppiOS — проект приложения Xamarin.iOS.
  • AppWindows — проект приложения Windows.

Таким образом, три проекта приложений совместно используют один и тот же исходный код (файлы C# в разделе Общие). Все изменения в общем коде будут совместно использоваться во всех трех проектах.

Преимущества

  • Позволяет совместно использовать код в нескольких проектах.
  • Общий код можно ветвить на основе платформы с помощью директив компилятора (например, с помощью #if __ANDROID__ , как описано в документе Создание кроссплатформенных приложений ).
  • Проекты приложений могут содержать ссылки на конкретные платформы, которые может использовать общий код (например, использование Community.CsharpSqlite.WP7 в примере Tasky для Windows Phone).

Недостатки

  • Рефакторинг, влияющий на код в директивах "неактивного" компилятора, не обновляет код внутри этих директив.
  • В отличие от большинства других типов проектов, общий проект не имеет сборки output. Во время компиляции файлы обрабатываются как часть ссылающегося проекта и компилируются в этой сборке. Если вы хотите предоставить общий доступ к коду в виде сборки, лучшее решение — .NET Standard или переносимые библиотеки классов.

Комментарии

Хорошее решение для разработчиков приложений, которые пишут код, предназначенный только для совместного использования в их приложении (а не для распространения среди других разработчиков).

Переносимые библиотеки классов

Совет

Библиотеки .NET Standard 2.0 рекомендуется использовать вместо переносимых библиотек классов.

Переносимые библиотеки классов подробно рассматриваются здесь.

Переносимая схема библиотек классов

Преимущества

  • Позволяет совместно использовать код в нескольких проектах.
  • Операции рефакторинга всегда обновляют все затронутые ссылки.

Недостатки

  • Вместо них рекомендуется использовать библиотеки .NET Standard, нерекомендуемые в последних версиях Visual Studio. Ознакомьтесь с этим объяснением различий между PCL и .NET Standard.
  • Невозможно использовать директивы компилятора.
  • Доступно только подмножество платформы .NET Framework, определяемое выбранным профилем (дополнительные сведения см. в разделе Введение в PCL ).

Комментарии

Шаблон PCL считается устаревшим в последних версиях Visual Studio.

Итоги

Выбранная стратегия совместного использования кода будет определяться целевыми платформами. Выберите метод, который лучше всего подходит для вашего проекта.

.NET Standard — лучший вариант для создания общих библиотек кода (особенно для публикации в NuGet). Общие проекты хорошо работают для разработчиков приложений, которые планируют использовать в кроссплатформенных приложениях множество функциональных возможностей, зависящих от платформы.

Хотя проекты PCL по-прежнему поддерживаются в Visual Studio, для новых проектов рекомендуется использовать .NET Standard.