Delen via


Adaptieve versie-apps: nieuwe API's gebruiken met behoud van compatibiliteit met eerdere versies

Elke release van de Windows 10 SDK voegt interessante nieuwe functionaliteit toe waarvan u gebruik wilt maken. Niet al uw klanten werken hun apparaten echter tegelijkertijd bij naar de nieuwste versie van Windows 10 en u wilt ervoor zorgen dat uw app werkt op het breedst mogelijke aantal apparaten. Hier laten we u zien hoe u uw app ontwerpt, zodat deze wordt uitgevoerd op eerdere versies van Windows 10, maar ook gebruikmaakt van nieuwe functies wanneer uw app wordt uitgevoerd op een apparaat waarop de nieuwste update is geïnstalleerd.

Er zijn drie stappen om ervoor te zorgen dat uw app het breedste scala aan Windows 10 apparaten ondersteunt.

  • Configureer eerst uw Visual Studio project om de meest recente API's te targeten. Dit is van invloed op wat er gebeurt wanneer u uw app compileert.
  • Ten tweede voert u runtimecontroles uit om ervoor te zorgen dat u alleen API's aanroept die aanwezig zijn op het apparaat waarop uw app wordt uitgevoerd.
  • Ten derde test u uw app op de minimumversie en de doelversie van Windows 10.

Uw Visual Studio-project configureren

De eerste stap bij het ondersteunen van meerdere Windows 10 versies is het opgeven van de Target en Minimum ondersteunde OS/SDK-versies in uw Visual Studio-project.

  • Target: de SDK-versie waarmee Visual Studio uw app-code compileert en alle hulpprogramma's uitvoert. Alle API's en resources in deze SDK-versie zijn tijdens het compileren beschikbaar in uw app-code.
  • Minimum: de SDK-versie die de vroegste versie van het besturingssysteem ondersteunt waarop uw app kan worden uitgevoerd (en wordt geïmplementeerd door de Store) en de versie waarop Visual Studio de app-markeringscode compileert.

Tijdens runtime wordt uw app uitgevoerd op basis van de versie van het besturingssysteem waarop deze is geïmplementeerd, zodat uw app uitzonderingen genereert als u resources gebruikt of API's aanroept die niet beschikbaar zijn in die versie. Verderop in dit artikel ziet u hoe u runtimecontroles gebruikt om de juiste API's aan te roepen.

De doel- en minimuminstellingen geven het einde van een bereik van os-/SDK-versies op. Als u uw app echter test op de minimale versie, kunt u er zeker van zijn dat deze wordt uitgevoerd op alle versies tussen het minimum en het doel.

Aanbeveling

Visual Studio waarschuwt u niet voor API-compatibiliteit. Het is uw verantwoordelijkheid om te testen en ervoor te zorgen dat uw app werkt zoals verwacht op alle besturingssysteemversies tussen en inclusief het minimum en doel.

Wanneer u een nieuw project maakt in Visual Studio 2015, Update 2 of hoger, wordt u gevraagd de doel- en minimumversies in te stellen die door uw app worden ondersteund. De doelversie is standaard de meest geïnstalleerde SDK-versie en de minimumversie is de laagst geïnstalleerde SDK-versie. U kunt Doel en Minimum alleen kiezen uit SDK-versies die op uw computer zijn geïnstalleerd.

Stel de doel-SDK in Visual Studio in

We raden u doorgaans aan de standaardwaarden te laten staan. Als u echter een Preview-versie van de SDK hebt geïnstalleerd en u productiecode schrijft, moet u de doelversie van de Preview-SDK wijzigen in de nieuwste officiële SDK-versie.

Als u de minimum- en doelversie wilt wijzigen voor een project dat al in Visual Studio is gemaakt, gaat u naar Project -> Properties -> Application tab -> Targeting.

 Wijzig de doel-SDK in Visual Studio

Ter referentie toont de volgende tabel de buildnummers voor elke SDK.

Vriendelijke naam Versie OS/SDK-softwarebouw
RTM 1507 10240
November Bijwerking 1511 10586
Jubileumupdate 1607 14393
Creators Update 1703 15063
Fall Creators Update 1709 16299
April 2018 Bijwerking 1803 17134
Update van oktober 2018 1809 17763
Update van mei 2019 1903 18362

U kunt elke uitgebrachte versie van de SDK downloaden via de Windows SDK en emulatorarchief. U kunt de nieuwste Windows Insider Preview SDK downloaden vanuit de ontwikkelaarssectie van de Windows Insider-site.

Zie Windows 10 release-informatie voor meer informatie over Windows 10 updates. Zie het feitenblad Windows levenscyclus voor belangrijke informatie over de levenscyclus van Windows 10 ondersteuning.

API-controles uitvoeren

De sleutel tot versie van adaptieve apps is de combinatie van API-contracten en de ApiInformation-klasse . Met deze klasse kunt u detecteren of een opgegeven API-contract, -type of -lid aanwezig is, zodat u veilig API-aanroepen kunt uitvoeren op verschillende apparaten en besturingssysteemversies.

API-contracten

De set API's binnen een apparaatfamilie wordt onderverdeeld in onderverdelingen, ook wel API-contracten genoemd. U kunt de methode ApiInformation.IsApiContractPresent gebruiken om te testen op de aanwezigheid van een API-contract. Dit is handig als u wilt testen op de aanwezigheid van veel API's die allemaal bestaan in dezelfde versie van een API-contract.

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

Wat is een API-contract? In wezen vertegenwoordigt een API-contract een functie: een set gerelateerde API's die samen een bepaalde functionaliteit leveren. Een hypothetisch API-contract kan een set API's vertegenwoordigen die twee klassen, vijf interfaces, één structuur, twee opsommingen enzovoort bevatten.

Logisch gerelateerde typen worden gegroepeerd in een API-contract en beginnend met Windows 10 is elke Windows Runtime API lid van een bepaald API-contract. Met API Contracts controleert u op de beschikbaarheid van een specifieke functie of API op het apparaat, waarbij u de mogelijkheden van een apparaat effectief controleert in plaats van te controleren op een specifiek apparaat of besturingssysteem. Een platform waarmee een API in een API-contract wordt geïmplementeerd, is vereist om elke API in dat API-contract te implementeren. Dit betekent dat u kunt testen of het actieve besturingssysteem een bepaald API-contract ondersteunt en, als dat het geval is, een van de API's in dat API-contract aanroept zonder dat elk afzonderlijk wordt gecontroleerd.

Het grootste en meest gebruikte API-contract is het Windows. Foundation.UniversalApiContract. Het bevat het merendeel van de API's in de Universal Windows Platform. In de SDK's voor apparaatfamilieuitbreidingen en API-contracten worden de verschillende beschikbare API-contracten beschreven. U ziet dat de meeste van deze API's een set functioneel gerelateerde API's vertegenwoordigen.

Opmerking

Als u een preview-Windows Software Development Kit (SDK) hebt geïnstalleerd die nog niet is gedocumenteerd, kunt u ook informatie vinden over api-contractondersteuning in het bestand 'Platform.xml' in de SDK-installatiemap op '(Program Files (x86))\Windows Kits\10\Platforms<platform><SDK-versie>\Platform.xml'.

Adaptieve versiecode en voorwaardelijke XAML

In alle versies van Windows 10 kunt u de ApiInformation-klasse in een voorwaarde in uw code gebruiken om te testen op de aanwezigheid van de API die u wilt aanroepen. In uw adaptieve code kunt u verschillende methoden van de klasse gebruiken, zoals IsTypePresent, IsEventPresent, IsMethodPresent en IsPropertyPresent, om te testen op API's die u nodig hebt.

Zie Adaptieve versiecode voor meer informatie en voorbeelden.

Als de minimumversie van uw apps build 15063 (Creators Update) of hoger is, kunt u voorwaardelijke XAML gebruiken om eigenschappen in te stellen en objecten in de markup te instantiëren zonder dat u achterliggende code hoeft te gebruiken. Voorwaardelijk XAML biedt een manier om de methode ApiInformation.IsApiContractPresent te gebruiken in markeringen.

Zie Voorwaardelijke XAML voor meer informatie en voorbeelden.

Uitgestelde geladen API's

Met de functie QueryOptionalDelayLoadedAPI kunnen Store-apps (die volgens het beleid LoadLibrary niet mogen aanroepen) detecteren of hun vertraagd geladen functie daadwerkelijk is gevonden.

#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;
}

Test uw versie-adaptieve app

Wanneer u adaptieve versiecode of VOORWAARDELIJKE XAML gebruikt om een adaptieve versie-app te schrijven, moet u deze testen op een apparaat met de minimumversie en op een apparaat waarop de doelversie van Windows 10 wordt uitgevoerd.

U kunt niet alle voorwaardelijke codepaden op één apparaat testen. Om ervoor te zorgen dat alle codepaden worden getest, moet u uw app implementeren en testen op een extern apparaat (of virtuele machine) waarop de minimaal ondersteunde versie van het besturingssysteem wordt uitgevoerd. Zie UWP-apps implementeren en fouten opsporen voor meer informatie over foutopsporing op afstand.