Información general sobre el uso compartido de códigoSharing code overview

En este documento se comparan los distintos métodos para compartir código entre proyectos multiplataforma: .NET Standard, proyectos compartidos y bibliotecas de clases portables, incluidas las ventajas y desventajas de cada uno.This document compares the different methods of sharing code between cross-platform projects: .NET Standard, Shared Projects, and Portable Class Libraries, including the benefits and disadvantages of each.

Hay tres métodos para compartir código entre aplicaciones multiplataforma:There are three methods for sharing code between cross-platform applications:

  • .Net Standard bibliotecas : los proyectos de .net Standard pueden implementar código que se va a compartir entre varias plataformas y pueden tener acceso a un gran número de API de .net (dependiendo de la versión)..NET Standard Libraries – .NET Standard projects can implement code to be shared across multiple platforms, and can access a large number of .NET APIs (depending on the version). .NET Standard 1,0-1,6 implementan conjuntos de API progresivamente mayores, mientras que .NET Standard 2,0 proporciona la mejor cobertura de la BCL de .NET (incluidas las API de .NET disponibles en las aplicaciones de Xamarin)..NET Standard 1.0 - 1.6 implement progressively larger sets of APIs, while .NET Standard 2.0 provides the best coverage of the .NET BCL (including the .NET APIs available in Xamarin apps).
  • Proyectos compartidos : Use el tipo de proyecto de recursos compartidos para organizar el código fuente y use #if directivas de compilador según sea necesario para administrar los requisitos específicos de la plataforma.Shared Projects – Use the Shared Asset Project type to organize your source code, and use #if compiler directives as required to manage platform-specific requirements.
  • Bibliotecas de clases portables (en desuso): las bibliotecas de clases portables (PCL) pueden tener como destino varias plataformas con una superficie de API común y usar interfaces para proporcionar funcionalidad específica de la plataforma.Portable Class Libraries (deprecated) – Portable Class Libraries (PCLs) can target multiple platforms with a common API surface, and use Interfaces to provide platform-specific functionality. PCL están en desuso en las versiones más recientes de Visual Studio – usar .NET Standard en su lugar.PCLs are deprecated in the latest versions of Visual Studio – use .NET Standard instead.

El objetivo de una estrategia de uso compartido de código es admitir la arquitectura que se muestra en este diagrama, donde varias plataformas pueden utilizar un solo código base.The goal of a code-sharing strategy is to support the architecture shown in this diagram, where a single codebase can be utilized by multiple platforms.

Arquitectura de aplicación de código compartidoShared code application architecture

En este artículo se comparan los métodos disponibles para ayudarle a elegir el tipo de proyecto adecuado para las aplicaciones.This article compares the methods available to help you choose the right project type for your applications.

Bibliotecas de .NET Standard.NET Standard Libraries

Las bibliotecas de .net Standard proporcionan un conjunto bien definido de las bibliotecas de clases base a las que se puede hacer referencia en diferentes tipos de proyecto, incluidos proyectos multiplataforma como Xamarin. Android y Xamarin. iOS..NET Standard libraries provide a well defined set of the base class libraries that can be referenced in different project types, including cross-platform projects like Xamarin.Android and Xamarin.iOS. Se recomienda .NET Standard 2,0 para obtener la máxima compatibilidad con el código de .NET Framework existente..NET Standard 2.0 is recommended for maximum compatibility with existing .NET Framework code.

Diagrama de .NET Standard.NET Standard diagram

VentajasBenefits

  • Permite compartir código en varios proyectos.Allows you to share code across multiple projects.
  • Las operaciones de refactorización siempre actualizan todas las referencias afectadas.Refactoring operations always update all affected references.
  • Un área expuesta mayor de la biblioteca de clases base (BCL) de .NET está disponible en lugar de los perfiles PCL.A larger surface area of the .NET Base Class Library (BCL) is available than PCL profiles. En concreto, .NET Standard 2,0 tiene casi la misma superficie de API que la .NET Framework y se recomienda para las nuevas aplicaciones y migrar los PCL existentes.In particular, .NET Standard 2.0 has almost the same API surface as the .NET Framework and is recommended for new apps and porting existing PCLs.

DesventajasDisadvantages

  • No se pueden usar directivas de compilador como #if __IOS__.Cannot use compiler directives like #if __IOS__.

ComentariosRemarks

.NET Standard es similar a PCL, pero con un modelo más sencillo para la compatibilidad con plataformas y un mayor número de clases de la BCL..NET Standard is similar to PCL, but with a simpler model for platform support and a greater number of classes from the BCL.

Proyectos compartidosShared Projects

Los proyectos compartidos contienen archivos de código y recursos que se incluyen en cualquier proyecto que haga referencia a ellos.Shared Projects contain code files and assets that are included in any project that references them. Los proyectos de uso compartido no producen resultados compilados por sí solos.Share projects do not produce compiled output on their own.

Esta captura de pantalla muestra un archivo de solución que contiene tres proyectos de aplicación (para Android, iOS y Windows ) con un proyecto compartido C# que contiene archivos de código fuente comunes:This screenshot shows a solution file containing three application projects (for Android, iOS, and Windows), with a Shared project that contains common C# source code files:

Solución de proyecto compartidoShared project solution

La arquitectura conceptual se muestra en el diagrama siguiente, donde cada proyecto incluye todos los archivos de código fuente compartidos:The conceptual architecture is shown in the following diagram, where each project includes all the shared source files:

Diagrama del proyecto compartidoShared project diagram

EjemploExample

Una aplicación multiplataforma que admita iOS, Android y Windows requerirá un proyecto de aplicación para cada plataforma.A cross platform application that supports iOS, Android, and Windows would require an application project for each platform. El código común reside en el proyecto compartido.The common code lives in the Shared Project.

Una solución de ejemplo contendría las siguientes carpetas y proyectos (los nombres de proyecto se han elegido para la expresividad, los proyectos no tienen que seguir estas instrucciones de nomenclatura):An example solution would contain the following folders and projects (project names have been chosen for expressiveness, your projects do not have to follow these naming guidelines):

  • Compartido : proyecto compartido que contiene el código común a todos los proyectos.Shared – Shared Project containing the code common to all projects.
  • AppAndroid : proyecto de aplicación Xamarin. Android.AppAndroid – Xamarin.Android application project.
  • AppiOS : proyecto de aplicación Xamarin. iOS.AppiOS – Xamarin.iOS application project.
  • AppWindows : proyecto de aplicación para Windows.AppWindows – Windows application project.

De esta manera, los tres proyectos de aplicación comparten el mismo código fuente ( C# los archivos en compartida).In this way the three application projects are sharing the same source code (the C# files in Shared). Cualquier modificación del código compartido se compartirá entre los tres proyectos.Any edits to the shared code will be shared across all three projects.

VentajasBenefits

  • Permite compartir código en varios proyectos.Allows you to share code across multiple projects.
  • El código compartido se puede bifurcar en función de la plataforma mediante directivas de compilador (por ejemplo,Shared code can be branched based on the platform using compiler directives (eg. con #if __ANDROID__, como se describe en el documento creación de aplicaciones multiplataforma ).using #if __ANDROID__ , as discussed in the Building Cross Platform Applications document).
  • Los proyectos de aplicación pueden incluir referencias específicas de la plataforma que puede utilizar el código compartido (como el uso de Community.CsharpSqlite.WP7 en el ejemplo de tareas para Windows Phone).Application projects can include platform-specific references that the shared code can utilize (such as using Community.CsharpSqlite.WP7 in the Tasky sample for Windows Phone).

DesventajasDisadvantages

  • Las refactorizaciones que afectan al código dentro de las directivas de compilador ' Inactive ' no actualizarán el código dentro de esas directivas.Refactorings that affect code inside 'inactive' compiler directives will not update the code inside those directives.
  • A diferencia de la mayoría de los demás tipos de proyecto, un proyecto compartido no tiene ningún ensamblado ' Output '.Unlike most other project types, a Shared Project has no 'output' assembly. Durante la compilación, los archivos se tratan como parte del proyecto de referencia y se compilan en ese ensamblado.During compilation, the files are treated as part of the referencing project and compiled into that assembly. Si desea compartir el código como un ensamblado, .NET Standard o las bibliotecas de clases portables son una solución mejor.If you wish to share your code as a assembly then .NET Standard or Portable Class Libraries are a better solution.

ComentariosRemarks

Una buena solución para que los desarrolladores de aplicaciones escriban código que solo está diseñado para compartir en su aplicación (y no se distribuye a otros desarrolladores).A good solution for application developers writing code that is only intended for sharing in their app (and not distributing to other developers).

Bibliotecas de clases portablesPortable Class Libraries

Sugerencia

Se recomiendan .NET Standard bibliotecas de 2,0 a través de bibliotecas de clases portables..NET Standard 2.0 libraries are recommended over Portable Class Libraries.

Las bibliotecas de clases portables se describen en detalle aquí.Portable Class Libraries are discussed in detail here.

Diagrama de la biblioteca de clases portablePortable class library diagram

VentajasBenefits

  • Permite compartir código en varios proyectos.Allows you to share code across multiple projects.
  • Las operaciones de refactorización siempre actualizan todas las referencias afectadas.Refactoring operations always update all affected references.

DesventajasDisadvantages

  • En desuso en las versiones más recientes de Visual Studio, en su lugar se recomienda .NET Standard bibliotecas.Deprecated in the latest versions of Visual Studio, .NET Standard libraries are recommended instead. Consulte esta explicación de las diferencias entre PCL y .net Standard.Refer to this explanation of the differences between PCL and .NET Standard.
  • No se pueden usar directivas de compilador.Cannot use compiler directives.
  • Solo un subconjunto de .NET Framework está disponible para su uso, determinado por el perfil seleccionado (consulte Introducción a PCL para obtener más información).Only a subset of the .NET framework is available to use, determined by the profile selected (see the Introduction to PCL for more info).

ComentariosRemarks

La plantilla PCL se considera en desuso en las versiones más recientes de Visual Studio.PCL template is considered deprecated in the latest versions of Visual Studio.

ResumenSummary

La estrategia de uso compartido de código que elija dependerá de las plataformas de destino.The code sharing strategy you choose will be driven by the platforms you are targeting. Elija un método que funcione mejor para su proyecto.Choose a method that works best for your project.

.NET Standard es la mejor opción para compilar bibliotecas de código que se pueda compartir (especialmente publicar en NuGet)..NET Standard is the best choice for building sharable code libraries (especially publishing on NuGet). Los proyectos compartidos funcionan bien para los desarrolladores de aplicaciones que planean usar una gran cantidad de funcionalidad específica de la plataforma en sus aplicaciones multiplataforma.Shared Projects work well for application developers planning to use lots of platform-specific functionality in their cross-platform apps.

Aunque los proyectos PCL siguen siendo compatibles con Visual Studio, se recomienda .NET Standard para los proyectos nuevos.While PCL projects continue to be supported in Visual Studio, .NET Standard is recommended for new projects.