Platformfüggetlen célzás

A modern .NET több operációs rendszert és eszközt is támogat. A nyílt forráskódú .NET-kódtárak számára fontos, hogy a lehető legtöbb fejlesztőt támogassák, legyen szó az Azure-ban üzemeltetett ASP.NET webhelyről, vagy a Unity .NET-játékáról.

.NET- és .NET Standard-célok

A .NET- és a .NET Standard-célok a legjobb módja annak, hogy platformfüggetlen támogatást adjanak a .NET-kódtárakhoz.

  • A .NET Standard az összes .NET-implementációban elérhető .NET API-k specifikációja. A .NET Standard megcélzásával olyan kódtárakat hozhat létre, amelyek a .NET Standard egy adott verziójában található API-k használatára vannak korlátozva, ami azt jelenti, hogy a .NET Standard ezen verzióját implementáló összes platform használhatja.
  • A .NET 6-8 a .NET implementációja. Minden verzió egyetlen termék, amely egységes képességekkel és API-kkal rendelkezik, amelyek windowsos asztali alkalmazásokhoz, platformfüggetlen konzolalkalmazásokhoz, felhőszolgáltatásokhoz és webhelyekhez használhatók.

A .NET és a .NET Standard összehasonlításáról további információt a .NET 5 és a .NET Standard című témakörben talál.

.NET Standard

Ha a projekt a .NET-et vagy a .NET Standardot célozza meg, és sikeresen fordít, nem garantálja, hogy a kódtár minden platformon sikeresen fut:

  • A platformspecifikus API-k más platformokon is sikertelenek lesznek. Windows rendszeren például sikeres lesz, Microsoft.Win32.Registry és bármely más operációs rendszeren való használatkor dobni PlatformNotSupportedException fog.
  • Az API-k eltérően viselkedhetnek. A tükröződési API-k például eltérő teljesítményjellemzőkkel rendelkeznek, ha egy alkalmazás előre összeállított összeállítást használ iOS-en vagy UWP-n.

Tipp.

A .NET csapata platformkompatibilitás-elemzőt kínál a lehetséges problémák felderítéséhez.

✔️ DO kezdjük a cél belefoglalása netstandard2.0 .

A legtöbb általános célú kódtárnak nincs szüksége a .NET Standard 2.0-n kívüli API-kra. A .NET Standard 2.0-t minden modern platform támogatja, és ez az ajánlott módja annak, hogy több platformot is támogatjon egy célértékkel. Ha nem kell támogatnia a .NET-keretrendszer, a .NET Standard 2.1-et is célba vehet.

✔️ HA új API-kat szeretne bevezetni egy modern .NET-ben, a DO tartalmazzon egy net6.0 célt vagy egy újabbat.

A .NET 6-os és újabb verziói használhatják a célokat netstandard2.0 , ezért net6.0 nincs szükség rá. Kifejezetten meg kell céloznia net6.0, net7.0vagy net8.0 ha újabb .NET API-kat szeretne használni.

❌ KERÜLJE a célokat netstandard1.x .

A .NET Standard 1.x a NuGet-csomagok részletes készleteként van elosztva, amely egy nagy csomagfüggőségi gráfot hoz létre, és sok csomag letöltését eredményezi az összeállítás során. A modern .NET-implementációk támogatják a .NET Standard 2.0-t. Csak akkor érdemes a .NET Standard 1.x-et célozni, ha kifejezetten egy régebbi platformra van szüksége.

✔️ HA célra van szüksége, a DO tartalmaz egy netstandard2.0 célértéket netstandard1.x .

A .NET Standard 2.0-t támogató összes platform használja a netstandard2.0 célt, és kihasználja, hogy kisebb csomagdiagramot használ, míg a régebbi platformok továbbra is működni fognak, és vissza fognak esni a netstandard1.x cél használatára.

❌ NE tartalmazzon .NET Standard-célt, ha a kódtár platformspecifikus alkalmazásmodellre támaszkodik.

Az UWP vezérlőeszköztár például egy olyan alkalmazásmodelltől függ, amely csak az UWP-n érhető el. Az alkalmazásmodell-specifikus API-k nem érhetők el a .NET Standardban.

Többhelyes célzás

Előfordulhat, hogy keretrendszerspecifikus API-kat kell elérnie a kódtárakból. A keretrendszerspecifikus API-k meghívásának legjobb módja a többhelyes célkezelés használata, amely a projektet több .NET-cél keretrendszerhez építi , nem pedig csak egyhez.

Annak érdekében, hogy megvédhesse a fogyasztókat attól, hogy egyéni keretrendszerekhez kelljen építeniük, törekednie kell arra, hogy .NET Standard kimenettel és egy vagy több keretrendszerspecifikus kimenettel rendelkezzen. Többhelyes használata mellett az összes szerelvény egyetlen NuGet-csomagba van csomagolva. A felhasználók ezután hivatkozhatnak ugyanarra a csomagra, és a NuGet kiválasztja a megfelelő megvalósítást. A .NET Standard kódtár a mindenhol használt tartalék kódtár, kivéve azokat az eseteket, amikor a NuGet-csomag keretrendszerspecifikus implementációt kínál. A többszörös célzás lehetővé teszi a feltételes fordítás használatát a kódban, és keretrendszerspecifikus API-kat hívhat meg.

NuGet package with multiple assemblies

✔️ FONTOLJA meg a .NET-implementációk célzását a .NET Standard mellett.

A .NET-implementációk megcélzása lehetővé teszi a .NET Standardon kívüli platformspecifikus API-k meghívását.

Ha ezt teszi, ne vesse el a .NET Standard támogatását. Ehelyett dobjon ki a megvalósításból, és kínáljon képességi API-kat. Így a kódtár bárhol használható, és támogatja a funkciók futásidejű megvilágítását.

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

✔️ FONTOLJA meg a több célzást akkor is, ha a forráskód minden célhoz azonos, ha a projekt rendelkezik tár- vagy csomagfüggőségekkel.

Előfordulhat, hogy a projekt függő csomagjai – akár közvetlen, akár alsóbb rétegben – ugyanazt a kód API-kat használják, miközben a függő szerelvény különböző verzióiba vannak csomagolva cél-keretrendszerenként. Adott célok hozzáadása biztosítja, hogy a fogyasztóknak ne kelljen hozzáadniuk vagy frissíteniük a szerelvénykötés-átirányításokat.

❌ KERÜLJE a több célzást és a .NET Standard célzását, ha a forráskód minden célhoz azonos, és a projekt nem rendelkezik kódtár- vagy csomagfüggőségekkel.

A .NET Standard szerelvényt a NuGet automatikusan használja. Az egyes .NET-implementációk megcélzása előny nélkül növeli a *.nupkg méretet.

✔️ FONTOLJA meg egy cél net462 hozzáadását a cél felajánlásakor netstandard2.0 .

A .NET Standard 2.0 .NET-keretrendszer-ből való használata a 4.7.2-.NET-keretrendszer néhány problémájával foglalkozik. A .NET-keretrendszer 4.6.2- 4.7.1-en még .NET-keretrendszer fejlesztők számára a 4.6.2-.NET-keretrendszer hez készült bináris fájlokkal javíthatja a felhasználói élményt.

✔️ A DO egy NuGet-csomag használatával terjeszti a kódtárat.

A NuGet kiválasztja a fejlesztő számára a legjobb célt, és védi őket, hogy a megfelelő megvalósítást válasszák.

✔️ A DO egy projektfájl tulajdonságát TargetFrameworks használja több célzás esetén.

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <!-- This project will output netstandard2.0 and net462 assemblies -->
    <TargetFrameworks>netstandard2.0;net462</TargetFrameworks>
  </PropertyGroup>
</Project>

✔️ Fontolja meg az MSBuild.Sdk.Extras használatát az UWP és a Xamarin többszörös célzásánál, mivel ez jelentősen leegyszerűsíti a projektfájlt.

❌ NE módosítsa a szerelvény nevét, vagy használjon különböző szerelvényneveket a tár által lefordított TFM-ekhez. A kódtárak közötti függőségek miatt a TFM-enként eltérő szerelvénynevekkel rendelkező több célzás megszakíthatja a csomagfogyasztókat. A szerelvénynek minden TFM-nek ugyanazzal a névvel kell rendelkeznie.

Régebbi célok

A .NET támogatja a már nem támogatott .NET-keretrendszer, valamint a már nem használt platformok célzását. Bár a tárat a lehető legtöbb célon kell dolgozni, a hiányzó API-k megkerülése jelentős többletterhelést jelenthet. Figyelembe véve azok elérését és korlátait, bizonyos keretrendszereket már nem érdemes célba venni.

❌ NE tartalmazzon hordozható osztálytárat (PCL) célként. Például: portable-net45+win8+wpa81+wp8.

A .NET Standard a platformfüggetlen .NET-kódtárak támogatásának és a PCL-k cseréjének modern módja.

❌ NE tartalmazzon olyan célokat a .NET-platformokhoz, amelyek már nem támogatottak. Például: SL4. WP