Panoramica del codice di condivisione

Questo documento confronta i diversi metodi di condivisione del codice tra progetti multipiattaforma: .NET Standard, progetti condivisi e librerie di classi portabili, inclusi i vantaggi e gli svantaggi di ognuno di essi.

Esistono tre metodi per condividere il codice tra applicazioni multipiattaforma:

  • Librerie .NET Standard: i progetti .NET Standard possono implementare il codice da condividere tra più piattaforme e possono accedere a un numero elevato di API .NET (a seconda della versione). .NET Standard 1.0 - 1.6 implementa set di API progressivamente più grandi, mentre .NET Standard 2.0 offre la migliore copertura del BCL .NET (incluse le API .NET disponibili nelle app Xamarin).
  • Progetti condivisi: usare il tipo progetto di asset condiviso per organizzare il codice sorgente e usare #if le direttive del compilatore in base alle esigenze per gestire i requisiti specifici della piattaforma.
  • Librerie di classi portabili (deprecate): le librerie di classi portabili (PCL) possono essere destinate a più piattaforme con una superficie API comune e usare interfacce per fornire funzionalità specifiche della piattaforma. Le licenze CAL sono deprecate nelle versioni più recenti di Visual Studio. Usare invece .NET Standard.

L'obiettivo di una strategia di condivisione del codice è supportare l'architettura illustrata in questo diagramma, in cui una singola codebase può essere usata da più piattaforme.

Shared code application architecture

Questo articolo confronta i metodi disponibili per scegliere il tipo di progetto appropriato per le applicazioni.

Librerie .NET Standard

Le librerie .NET Standard forniscono un set ben definito delle librerie di classi di base a cui è possibile fare riferimento in diversi tipi di progetto, inclusi progetti multipiattaforma come Xamarin.Android e Xamarin.iOS. .NET Standard 2.0 è consigliato per garantire la massima compatibilità con il codice .NET Framework esistente.

.NET Standard diagram

Vantaggi

  • Consente di condividere il codice tra più progetti.
  • Le operazioni di refactoring aggiornano sempre tutti i riferimenti interessati.
  • Una superficie di attacco maggiore della libreria di classi di base .NET è disponibile rispetto ai profili PCL. In particolare, .NET Standard 2.0 ha quasi la stessa superficie API di .NET Framework ed è consigliata per le nuove app e la conversione di pcls esistenti.

Svantaggi

  • Impossibile usare direttive del compilatore come #if __IOS__.

Osservazioni:

.NET Standard è simile a PCL, ma con un modello più semplice per il supporto della piattaforma e un numero maggiore di classi dall'elenco di classi BCL.

Progetti condivisi

I progetti condivisi contengono file di codice e asset inclusi in qualsiasi progetto che vi fa riferimento. I progetti di condivisione non producono output compilato autonomamente.

Questo screenshot mostra un file di soluzione contenente tre progetti di applicazione (per Android, iOS e Windows), con un progetto condiviso che contiene file di codice sorgente C# comuni:

Shared project solution

L'architettura concettuale è illustrata nel diagramma seguente, in cui ogni progetto include tutti i file di origine condivisi:

Shared project diagram

Esempio

Un'applicazione multipiattaforma che supporta iOS, Android e Windows richiederebbe un progetto di applicazione per ogni piattaforma. Il codice comune si trova nel progetto condiviso.

Una soluzione di esempio conterrà le cartelle e i progetti seguenti (i nomi dei progetti sono stati scelti per l'espressività, i progetti non devono seguire queste linee guida per la denominazione):

  • Condiviso : progetto condiviso contenente il codice comune a tutti i progetti.
  • AppAndroid : progetto di applicazione Xamarin.Android.
  • AppiOS : progetto di applicazione Xamarin.iOS.
  • AppWindows : progetto di applicazione Windows.

In questo modo i tre progetti dell'applicazione condividono lo stesso codice sorgente (i file C# in Condiviso). Tutte le modifiche apportate al codice condiviso verranno condivise in tutti e tre i progetti.

Vantaggi

  • Consente di condividere il codice tra più progetti.
  • Il codice condiviso può essere diramato in base alla piattaforma usando direttive del compilatore , ad esempio usando #if __ANDROID__ , come illustrato nel documento Compilazione di applicazioni multipiattaforma .
  • I progetti dell'applicazione possono includere riferimenti specifici della piattaforma che il codice condiviso può usare , ad esempio usando Community.CsharpSqlite.WP7 nell'esempio Tasky per Windows Telefono.

Svantaggi

  • I refactoring che influiscono sul codice all'interno delle direttive del compilatore "inattivi" non aggiorneranno il codice all'interno di tali direttive.
  • A differenza della maggior parte degli altri tipi di progetto, un progetto condiviso non ha assembly 'output'. Durante la compilazione, i file vengono considerati come parte del progetto di riferimento e compilati in tale assembly. Se si vuole condividere il codice come assembly, le librerie di classi .NET Standard o portabili sono una soluzione migliore.

Osservazioni:

Una buona soluzione per gli sviluppatori di applicazioni che scrivono codice destinato solo alla condivisione nella propria app (e non alla distribuzione ad altri sviluppatori).

Librerie di classi portabili

Suggerimento

Le librerie .NET Standard 2.0 sono consigliate rispetto alle librerie di classi portabili.

Le librerie di classi portabili sono descritte in dettaglio qui.

Portable class library diagram

Vantaggi

  • Consente di condividere il codice tra più progetti.
  • Le operazioni di refactoring aggiornano sempre tutti i riferimenti interessati.

Svantaggi

  • Sono invece consigliate le librerie .NET Standard deprecate nelle versioni più recenti di Visual Studio. Fare riferimento a questa spiegazione delle differenze tra PCL e .NET Standard.
  • Impossibile utilizzare le direttive del compilatore.
  • Solo un subset di .NET Framework è disponibile per l'uso, determinato dal profilo selezionato (vedere Introduzione alla libreria di classi portabile per altre informazioni).

Osservazioni:

Il modello PCL è considerato deprecato nelle versioni più recenti di Visual Studio.

Riepilogo

La strategia di condivisione del codice scelta sarà guidata dalle piattaforme di destinazione. Scegliere un metodo che funzioni meglio per il progetto.

.NET Standard è la scelta migliore per la compilazione di librerie di codice condivisibili (in particolare la pubblicazione in NuGet). I progetti condivisi funzionano bene per gli sviluppatori di applicazioni che pianificano l'uso di numerose funzionalità specifiche della piattaforma nelle app multipiattaforma.

Sebbene i progetti PCL continuino a essere supportati in Visual Studio, .NET Standard è consigliato per i nuovi progetti.