App adattive per la versione: usare le nuove API, mantenendo al tempo stesso la compatibilità con le versioni precedenti

In ogni versione di Windows 10 SDK vengono aggiunte nuove funzionalità interessanti che vorrai usare. Non tutti i clienti, tuttavia, aggiorneranno i loro dispositivi alla versione più recente di Windows 10 nello stesso momento e quindi vorrai assicurarti che la tua app funzioni sulla più ampia gamma possibile di dispositivi. In questo articolo illustreremo come progettare l'app in modo che possa essere eseguita nelle versioni precedenti di Windows 10, ma anche avvalersi di nuove funzionalità quando viene usata in un dispositivo in cui è installato l'aggiornamento più recente.

Sono 3 i passaggi necessari per assicurarti che l'app supporti la più ampia gamma di dispositivi Windows 10.

  • Prima di tutto, configura il tuo progetto di Visual Studio per l'uso delle API più recenti. Questo aspetto ha effetti sulla compilazione dell'app.
  • In secondo luogo, esegui dei controlli di runtime per assicurarti di chiamare solo le API presenti nel dispositivo in cui viene eseguita la tua app.
  • Infine, testa l'app nella versione minima e nella versione di destinazione di Windows 10.

Configurare il progetto di Visual Studio

Il primo passaggio per il supporto di più versioni di Windows 10 consiste nello specificare le versioni Destinazione e Minima del sistema operativo e dell'SDK supportate nel progetto di Visual Studio.

  • Destinazione: versione dell'SDK di riferimento per la compilazione del codice dell'app e l'esecuzione di tutti gli strumenti in Visual Studio. Tutte le API e le risorse in questa versione dell'SDK sono disponibili nel codice dell'app in fase di compilazione.
  • Minima: versione dell'SDK che supporta la versione minima del sistema operativo su cui può essere eseguita la tua app (e in cui verrà distribuita dallo Store) e la versione di riferimento per la compilazione del codice di markup dell'app in Visual Studio.

Durante il runtime, la tua app sarà eseguita nella versione del sistema operativo per cui è distribuita, quindi genererà eccezioni se usi risorse o chiami API non disponibili in tale versione. Ti mostreremo come usare i controlli di runtime per chiamare le API corrette più avanti in questo articolo.

Le impostazioni Destinazione e Minima specificano le estremità dell'intervallo di versioni del sistema operativo e dell'SDK. Se testi la tua app nella versione minima, tuttavia, puoi essere certo che verrà eseguita in qualsiasi versione compresa tra quella minima e quella di destinazione.

Suggerimento

Visual Studio non genera avvisi in merito alla compatibilità delle API. È tua responsabilità eseguire test e assicurarti che le prestazioni della tua app siano adeguate in tute le versioni del sistema operativo nell'intervallo da Minima a Destinazione, incluse.

Quando crei un nuovo progetto in Visual Studio 2015 Update 2 o versioni successive, ti viene richiesto di impostare le versioni di destinazione e minima supportate dall'app. Per impostazione predefinita, la versione di destinazione è la versione più recente dell'SDK installata e la versione minima è quella meno recente. Puoi scegliere la versione di destinazione e minima solo tra le versioni dell'SDK installate nel tuo computer.

Impostare l'SDK di destinazione in Visual Studio

In genere consigliamo di non cambiare le impostazioni predefinite. Se hai installato una versione di anteprima dell'SDK e stai scrivendo codice di produzione, tuttavia, devi cambiare l'impostazione della versione di destinazione da SDK anteprima all'ultima versione ufficiale dell'SDK.

Per modificare la versione minima e di destinazione per un progetto già creato in Visual Studio, vai a Progetto ->; Proprietà -> Scheda Applicazione -> Destinazione.

Modificare l'SDK di destinazione in Visual Studio

Come riferimento, nella tabella seguente vengono illustrati i numeri di build di ogni SDK.

Nome descrittivo Versione Build sistema operativo/SDK
RTM 1507 10240
Aggiornamento di novembre 1511 10586
Aggiornamento dell'anniversario 1607 14393
Creators Update 1703 15063
Fall Creators Update 1709 16299
Aggiornamento di aprile 2018 1803 17134
Aggiornamento di ottobre 2018 1809 17763
Aggiornamento di maggio 2019 1903 18362

Puoi scaricare qualsiasi versione rilasciata dell'SDK da Archivio per Windows SDK ed emulatori. Puoi scaricare la versione più recente dell’SDK anteprima del Programma Windows Insider dalla sezione per gli sviluppatori del sito Windows Insider.

Per altre informazioni sugli aggiornamenti di Windows 10, vedi Informazioni sulla versione di Windows 10. Per informazioni importanti sul ciclo di vita del supporto di Windows 10, vedi la scheda informativa sul ciclo di vita di Windows.

Eseguire i controlli delle API

La chiave per le app adattive per la versione è la combinazione dei contratti API e della classe ApiInformation. Questa classe consente di rilevare la presenza di un membro, di un tipo o di un contratto API specificato, per poter effettuare chiamate API in modo sicuro in un'ampia gamma di dispositivi e di versioni del sistema operativo.

Contratti API

Il set di API all'interno di una famiglia di dispositivi è organizzato in suddivisioni note come contratti API. Puoi verificare la presenza di un contratto API usando il metodo ApiInformation.IsApiContractPresent. Ciò è utile se vuoi verificare la presenza di un numero elevato di API tutte appartenenti alla stessa versione di un contratto API.

    bool isScannerDeviceContract_1_Present =
        Windows.Foundation.Metadata.ApiInformation.IsApiContractPresent
            ("Windows.Devices.Scanners.ScannerDeviceContract", 1);

Che cos'è un contratto API? In pratica, un contratto API rappresenta una funzionalità, un set di API correlate che insieme offrono alcune funzionalità particolari. Un contratto API ipotetico potrebbe rappresentare un set di API contenente due classi, cinque interfacce, una struttura, due enumerazioni e così via.

I tipi correlati logicamente vengono raggruppati in un contratto API e a partire da Windows 10, ogni API di Windows Runtime è un membro di un contratto API. Con i contratti API, verifichi la disponibilità nel dispositivo di una funzionalità specifica o di un'API, verifichi in modo efficiente le funzionalità di un dispositivo anziché un dispositivo o un sistema operativo specifici. Per implementare ogni API in un determinato contratto API, è necessaria una piattaforma che implementi qualsiasi API in un contratto API. Ciò significa che puoi verificare se il sistema operativo in esecuzione supporta un contratto API specifico e, in caso affermativo, puoi chiamare una delle API in tale contratto API senza controllarle una per volta.

Il contratto API più grande e usato con maggiore frequenza è Windows.Foundation.UniversalApiContract. Contiene la maggior parte delle API della piattaforma UWP (Universal Windows Platform). La documentazione Contratti API e SDK di estensione della famiglia di dispositivi descrive la varietà di contratti API disponibili. Si noterà che la maggior parte di tali contratti rappresenta un set di API correlate alle funzionalità.

Nota

Se disponi di una versione di anteprima di Windows Software Development Kit (Windows SDK) non ancora documentata, puoi trovare informazioni sul supporto dei contratti API anche nel file 'Platform.xml' che si trova nella cartella di installazione dell'SDK in "(Program Files (x86))\Windows Kits\10\Platforms<piattaforma><versione SDK>\Platform.xml".

Codice adattivo per la versione e XAML condizionale

Per testare la presenza dell'API che vuoi chiamare, in tutte le versioni di Windows 10 puoi usare la classe ApiInformation in una condizione del codice. Nel codice adattivo, puoi usare diversi metodi della classe, ad esempio IsTypePresent, IsEventPresent, IsMethodPresent e IsPropertyPresent, per verificare la presenza delle API al livello di granularità necessario.

Per altre informazioni ed esempi, vedi Codice adattivo per la versione.

Se la versione minima delle app è la build 15063 (Creators Update) o versioni successive, puoi usare XAML condizionale per impostare le proprietà e creare istanze degli oggetti nel markup senza dover usare code-behind. XAML condizionale consente di usare il metodo ApiInformation.IsApiContractPresent nel markup.

Per altre informazioni ed esempi, vedi XAML condizionale.

API caricate in ritardo

La funzione QueryOptionalDelayLoadedAPI consente alle app dello Store (a cui i criteri non consentono di richiamare LoadLibrary) di rilevare se la funzione caricata in ritardo è stata effettivamente trovata.

#include <windows.h>
#include <commdlg.h>
#include <libloaderapi2.h>
#include <stdio.h>

EXTERN_C IMAGE_DOS_HEADER __ImageBase;
#define HMODULE_THISCOMPONENT reinterpret_cast<HMODULE>(&__ImageBase)

int __cdecl main(int argc, char** argv)
{
    if (QueryOptionalDelayLoadedAPI(HMODULE_THISCOMPONENT,
          "comdlg32.dll", "GetOpenFileNameW", 0))
    {
        printf("GetOpenFileNameW can be called!\n");
    }
    return 0;
}

Testare l'app adattiva per la versione

Quando usi il codice adattivo per la versione o XAML condizionale per scrivere un'app adattiva per la versione, devi testarla in un dispositivo che esegue la versione minima di Windows 10 e in un dispositivo che esegue la versione di destinazione.

Non puoi testare tutti i percorsi del codice condizionale in un singolo dispositivo. Per garantire che vengano testati tutti i percorsi del codice, devi distribuire e testare l'app in un dispositivo remoto (o in una macchina virtuale) che esegue la versione minima supportata del sistema operativo. Per altre informazioni sul debug remoto, vedi Distribuzione e debug di app UWP.