Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Moderne .NET ondersteunt meerdere besturingssystemen en apparaten. Het is belangrijk dat .NET opensource-bibliotheken zoveel mogelijk ontwikkelaars ondersteunen, ongeacht of ze een ASP.NET website bouwen die wordt gehost in Azure of een .NET-game in Unity.
Wanneer u doelframeworks voor uw bibliotheek kiest, is het belangrijk om onderscheid te maken tussen twee verschillende doelen:
- Moderne API's en patronen: Uw bibliotheek profiteert van de voordelen van de recente versies van het .NET-platform. U gebruikt moderne taalpatronen en biedt ondersteuning voor geavanceerde implementatiemodellen, zoals Native Ahead-Of-Time-compilatie op de CoreCLR.
- Breedte gericht: uw bibliotheek ondersteunt een breed scala aan .NET-implementaties en -versies om de compatibiliteit in verschillende gebruikersscenario's te maximaliseren.
Voor deze doelen is niet altijd dezelfde benadering vereist. Als uw doeltoepassingen allemaal moderne .NET gebruiken, kunnen uw bibliotheken zich richten op dezelfde moderne .NET-versies zonder oudere frameworks te hoeven gebruiken.
.NET en .NET Standard doelen
.NET- en .NET Standard-doelen zijn de beste manier om platformoverschrijdende ondersteuning toe te voegen aan een .NET-bibliotheek.
- .NET-versies 5 tot en met 10 zijn implementaties van .NET. Elke versie is één product met een uniforme set mogelijkheden en API's die kunnen worden gebruikt voor Windows-desktop-apps en platformoverschrijdende console-apps, cloudservices en websites.
- .NET Standard is een specificatie van .NET API's die beschikbaar zijn voor alle .NET-implementaties. Met .NET Standard kunt u bibliotheken produceren die zijn beperkt tot het gebruik van API's die zich in een bepaalde versie van .NET Standard bevinden. Dit betekent dat het kan worden gebruikt door alle platforms die die versie van .NET Standard implementeren.
Zie .NET 5 en .NET Standard voor meer informatie over hoe .NET Standard zich verhoudt tot .NET Standard.
Als uw project zich richt op .NET of .NET Standard en succesvol wordt gecompileerd, wordt niet gegarandeerd dat de bibliotheek succesvol op alle platforms draait.
- Platformspecifieke API's mislukken op andere platforms. Slaagt bijvoorbeeld Microsoft.Win32.Registry in Windows en genereert PlatformNotSupportedException wanneer dit wordt gebruikt in een ander besturingssysteem.
- API's kunnen zich anders gedragen. Reflectie-API's hebben bijvoorbeeld verschillende prestatiekenmerken wanneer een toepassing vooraf compilatie op iOS of UWP gebruikt.
Aanbeveling
Het .NET-team biedt een platformcompatibiliteitsanalyse waarmee u mogelijke problemen kunt detecteren.
✔️ Begin met het opnemen van een net8.0 doel of hoger voor nieuwe bibliotheken.
Voor nieuwe bibliotheken biedt het richten op moderne .NET (zoals .NET 8 of hoger) toegang tot de nieuwste API's en prestatieverbeteringen, en maakt het functies zoals AOT en trimmen mogelijk. Moderne .NET-versies zijn platformoverschrijdend en bieden uitstekende compatibiliteit in Windows, Linux en macOS.
✔️ OVERWEEG een netstandard2.0 doel op te nemen als u brede compatibiliteit of .NET Framework-ondersteuning nodig hebt.
.NET Standard 2.0 wordt ondersteund door .NET Framework 4.6.1+ en alle moderne .NET-implementaties. Neem dit doel op wanneer u .NET Framework-toepassingen moet ondersteunen of wanneer u bibliotheken bouwt voor maximale compatibiliteit in verschillende .NET-ecosystemen.
❌ VERMIJD het opnemen van een netstandard1.x target.
.NET Standard 1.x wordt gedistribueerd als een gedetailleerde set NuGet-pakketten, die een grote pakketafhankelijkheidsgrafiek maakt en resulteert in het downloaden van veel pakketten bij het bouwen. Moderne .NET-implementaties ondersteunen .NET Standard 2.0. U moet alleen .NET Standard 1.x targeten als u specifiek op een ouder platform moet richten.
✔️ Neem een netstandard2.0 doel op als u een netstandard1.x doel nodig hebt.
Alle platforms die .NET Standard 2.0 ondersteunen, gebruiken het
netstandard2.0doel en profiteren van een kleinere pakketgrafiek, terwijl oudere platforms nog steeds werken en terugvallen op het gebruik van hetnetstandard1.xdoel.
❌ Neem geen .NET Standard-doel op als de bibliotheek afhankelijk is van een platformspecifiek app-model.
Een UWP-bibliotheek voor beheertoolkits is bijvoorbeeld afhankelijk van een app-model dat alleen beschikbaar is op UWP. App-modelspecifieke API's zijn niet beschikbaar in .NET Standard.
❌ PUBLICEER NIET voor netstandard2.0 als uw project of afhankelijkheden meerdere doelen hebben.
netstandard2.0is geen runtime, en projecten die zich op meerdere doelen richten bieden een runtime-frameworkspecifieke bibliotheek, die nodig is bij het uitvoeren op andere frameworks.
Meerdere doelen gericht
Soms moet u toegang krijgen tot frameworkspecifieke API's vanuit uw bibliotheken. De beste manier om frameworkspecifieke API's aan te roepen, is door multi-targeting te gebruiken, waarmee uw project wordt gebouwd voor veel .NET-doelframeworks in plaats van voor slechts één.
Als u uw consumenten wilt beschermen tegen het bouwen voor afzonderlijke frameworks, moet u streven naar een .NET Standard-uitvoer plus een of meer frameworkspecifieke uitvoer. Wanneer u met een multi-target werkt, worden alle assembly's verpakt in één enkel NuGet-pakket. Consumenten kunnen vervolgens verwijzen naar hetzelfde pakket en NuGet kiest de juiste implementatie. Uw .NET Standard-bibliotheek fungeert als de terugvalbibliotheek die overal wordt gebruikt, met uitzondering van de gevallen waarin uw NuGet-pakket een frameworkspecifieke implementatie biedt. Met meerdere targeting kunt u voorwaardelijke compilatie gebruiken in uw code en frameworkspecifieke API's aanroepen.
✔️ OVERWEEG naast .NET Standard ook te richten op .NET-implementaties.
Met .NET-implementaties kunt u platform-specifieke API's aanroepen die buiten de standaardomvang van .NET Standard vallen.
Verwijder geen ondersteuning voor .NET Standard wanneer u dit doet. In plaats daarvan moet u de implementatie loslaten en mogelijkheid-API's aanbieden. Op deze manier kan uw bibliotheek overal worden gebruikt en wordt het inschakelen van functies tijdens runtime ondersteund.
public static class GpsLocation
{
// This project uses multi-targeting to expose device-specific APIs to .NET Standard.
public static async Task<(double latitude, double longitude)> GetCoordinatesAsync()
{
#if NET462
return CallDotNetFrameworkApi();
#elif WINDOWS_UWP
return CallUwpApi();
#else
throw new PlatformNotSupportedException();
#endif
}
// Allows callers to check without having to catch PlatformNotSupportedException
// or replicating the OS check.
public static bool IsSupported
{
get
{
#if NET462 || WINDOWS_UWP
return true;
#else
return false;
#endif
}
}
}
✔️ OVERWEEG meerdere doelen, zelfs als uw broncode hetzelfde is voor alle doelen, wanneer uw project bibliotheek- of pakketafhankelijkheden heeft.
De afhankelijke pakketten van uw project, hetzij direct of downstream, kunnen dezelfde code-API's gebruiken terwijl ze zijn verpakt in verschillende versies van de afhankelijke assembly per doelframework. Het toevoegen van specifieke doelen zorgt ervoor dat uw gebruikers hun assemblybindingsomleidingen niet hoeven toe te voegen of bij te werken.
❌ VERMIJD zowel multi-targeting als het richten op .NET Standard, als uw broncode hetzelfde is voor alle doelen en uw project geen bibliotheek- of pakketafhankelijkheden heeft.
De .NET Standard-assembly wordt automatisch gebruikt door NuGet. Door afzonderlijke .NET-implementaties aan te sturen, neemt de
*.nupkggrootte toe zonder enig voordeel.
✔️ OVERWEEG een doelwit toe te voegen voor net462 wanneer u ook netstandard2.0 richt.
Het gebruik van .NET Standard 2.0 van .NET Framework heeft enkele problemen die zijn opgelost in .NET Framework 4.7.2. U kunt de ervaring voor ontwikkelaars die zich nog steeds op .NET Framework 4.6.2 - 4.7.1 bevinden, verbeteren door ze een binair bestand te bieden dat is gebouwd voor .NET Framework 4.6.2.
✔️ Distribueer uw bibliotheek met behulp van een NuGet-pakket.
NuGet selecteert het beste doel voor de ontwikkelaar en ontlast hen van het moeten kiezen van de juiste implementatie.
✔️ Gebruik de TargetFrameworks eigenschap van een projectbestand bij het multi-targeten.
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<!-- This project will output net8.0 and netstandard2.0 assemblies -->
<TargetFrameworks>net8.0;netstandard2.0</TargetFrameworks>
</PropertyGroup>
</Project>
❌ VERMIJD het wijzigen van de assemblynaam of het gebruik van verschillende assemblynamen voor elke TFM die door uw bibliotheek wordt gecompileerd. Vanwege de afhankelijkheden tussen bibliotheken kan multi-targeting met verschillende assemblynamen per TFM problemen veroorzaken voor pakketgebruikers. Een assembly moet dezelfde naam hebben in alle TFM's.
Oudere doelen
.NET biedt ondersteuning voor versies van .NET Framework die niet meer worden ondersteund en platformen die niet meer algemeen worden gebruikt. Hoewel er waarde is om uw bibliotheek zoveel mogelijk doelen te laten uitvoeren, kan het veel overhead opleveren om ontbrekende API's te omzeilen. Gezien hun bereik en beperkingen zijn sommige frameworks niet meer de moeite waard om doelwit te zijn.
❌ NEEM NIET een PCL-doel (Portable Class Library) op. Bijvoorbeeld: portable-net45+win8+wpa81+wp8.
.NET Standard is de moderne manier om platformoverschrijdende .NET-bibliotheken te ondersteunen en PCL's te vervangen.
❌ Neem geen doelen op voor .NET-platforms die niet meer worden ondersteund. Bijvoorbeeld, SL4. WP