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

В этом документе сравниваются различные методы совместного использования кода между кроссплатформенными проектами: .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.

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

Shared code application architecture

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

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

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

.NET Standard diagram

Льготы

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

Недостатки

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

Замечания

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

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

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

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

Shared project solution

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

Shared project diagram

Пример

Кроссплатформенное приложение, поддерживающее 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 рекомендуется использовать для переносимых библиотек классов.

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

Portable class library diagram

Льготы

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

Недостатки

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

Замечания

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

Итоги

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

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

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