.NET-RID-Katalog

RID ist die Kurzform für Runtime Identifier (Runtimebezeichner). Mithilfe von RID-Werten werden Zielplattformen identifiziert, unter der die Anwendung ausgeführt wird. Sie werden von .NET-Paketen verwendet, um plattformspezifische Ressourcen in NuGet-Paketen darzustellen. Die folgenden Werte sind Beispiele für RIDs: linux-x64, win-x64 oder osx-x64. Für die Pakete mit nativen Abhängigkeiten legt die RID fest, auf welchen Plattformen das Paket wiederhergestellt werden kann.

Eine einzelne RID kann im <RuntimeIdentifier>-Element Ihrer Projektdatei festgelegt werden. Mehrere RIDs können als Liste mit Semikolon als Trennzeichen im <RuntimeIdentifiers>-Element der Projektdatei definiert werden. Sie können auch über die Option --runtime mit den folgenden .NET-CLI-Befehlen verwendet werden:

RIDs, die konkrete Betriebssysteme darstellen, weisen in der Regel folgendes Muster auf: [os].[version]-[architecture]-[additional qualifiers], wobei:

  • [os] ist der Moniker des Betriebs-/Plattformsystems. Beispielsweise ubuntu.

  • [version] ist die Version des Betriebssystems in Form einer durch Punkte getrennten (.) Versionsnummer. Beispielsweise 15.10.

    Die Version sollte keine Marketingversion sein, da Marketingversionen häufig mehrere separate Versionen des Betriebssystems mit unterschiedlichen Plattform-API-Oberflächen darstellen.

  • [architecture] ist die Prozessorarchitektur. Beispielsweise x86, x64, arm oder arm64.

  • [additional qualifiers] differenziert die verschiedenen Plattformen noch stärker. Beispiel: aot.

RID-Diagramm

Das RID-Diagramm oder Runtimefallbackdiagramm ist eine Liste von RIDs, die miteinander kompatibel sind.

Diese RIDs werden in PortableRuntimeIdentifierGraph.json im dotnet/sdk-Repository definiert. In dieser Datei können Sie sehen, dass alle RIDs außer der Basis-RID eine "#import"-Anweisung enthalten. Diese Anweisungen geben kompatible RIDs an.

Vor .NET 8 wurden versionsspezifische und distributionsspezifische RIDs regelmäßig dem Microsoft.NETCore.Platforms-Paket und dem RID-Diagramm in der Datei runtime.json hinzugefügt, die sich im dotnet/runtime-Repository befindet. Dieses Diagramm wird nicht mehr aktualisiert und steht als Abwärtskompatibilitätsoption zur Verfügung. Entwickler*innen sollten RIDs verwenden, die nicht versionsspezifisch und nicht distributionsspezifisch sind.

Bei NuGet-Wiederherstellungspaketen wird versucht, eine genaue Übereinstimmung für die angegebene Runtime zu finden. Wenn keine genaue Übereinstimmung gefunden wird, durchläuft das NuGet erneut das Diagramm, bis es das System mit der größten Kompatibilität gemäß dem RID-Diagramm findet.

Im Folgenden wird ein Beispiel für den tatsächlichen Eintrag für die osx-x64-RID vorgestellt:

"osx-x64": {
    "#import": [ "osx", "unix-x64" ]
}

Die oben genannte RID gibt an, dass osx-x64unix-x64 importiert. Bei NuGet-Wiederherstellungspaketen wird daher versucht, eine genaue Übereinstimmung für osx-x64 im Paket zu finden. Wenn NuGet die angegebene Runtime nicht finden kann, können Pakete wiederhergestellt werden, die z. B. unix-x64-Runtimes angeben.

Das folgende Beispiel zeigt ein etwas größeres RID-Diagramm, das auch in der Datei runtime.json definiert ist:

    linux-arm64     linux-arm32
         |     \   /     |
         |     linux     |
         |       |       |
    unix-arm64   |    unix-x64
             \   |   /
               unix
                 |
                any

Alternativ können Sie das RidGraph-Tool verwenden, um das RID-Diagramm (oder eine beliebige Teilmenge des Diagramms) auf einfache Weise zu visualisieren.

Alle RIDs bilden schließlich wieder den Stamm any-RID ab.

Es gibt einige Aspekte zu RIDs, die Sie bei der Verwendung bedenken müssen:

  • Versuchen Sie nicht, RIDs zu analysieren, um Komponententeile abzurufen.

  • Verwenden Sie RIDs, die bereits für die Plattform definiert sind.

  • Die RIDs müssen spezifisch sein. Leiten Sie daher keine Annahmen anhand des tatsächlichen RID-Werts ab.

  • Erstellen Sie RIDs nicht programmgesteuert, es sei denn, es ist unbedingt erforderlich.

    Einige Apps müssen RIDs programmgesteuert berechnen. In diesem Fall müssen die berechneten RIDs genau mit dem Katalog übereinstimmen, einschließlich der Groß- und Kleinschreibung. RIDs mit unterschiedlicher Groß- und Kleinschreibung würden Probleme verursachen, wenn beim Betriebssystem (z. B. unter Linux) die Groß-/Kleinschreibung beachtet wird, da der Wert häufig beim Erstellen von Elementen wie Ausgabepfaden verwendet wird. Nehmen wir einen benutzerdefinierten Veröffentlichungs-Assistenten in Visual Studio als Beispiel, der auf Informationen aus dem Projektmappenkonfigurations-Manager und den Projekteigenschaften basiert. Wenn die Projektmappenkonfiguration einen ungültigen Wert übergibt, z. B. ARM64 anstelle von arm64, kann dies zu einer ungültigen RID führen, z. B. win-ARM64.

Die Verwendung von RIDs

Um RIDs verwenden zu können, müssen Sie wissen, welche RIDs es gibt. Prüfen Sie die Datei PortableRuntimeIdentifierGraph.json im dotnet/sdk-Repository auf die neueste und vollständige Version.

Es empfiehlt sich, RIDs auszuwählen, die als „portierbar“ gelten, also nicht an eine bestimmte Version oder Betriebssystemdistribution gebunden sind. Dies bedeutet, dass portierbare RIDs sowohl zum Erstellen einer plattformspezifischen Anwendung als auch zum Erstellen eines NuGet-Pakets mit RID-spezifischen Ressourcen verwendet werden sollten.

Ab .NET 8 werden vom .NET SDK und von der Runtime standardmäßig nur nicht versionsspezifische und nicht distributionsspezifische RIDs berücksichtigt. Beim Wiederherstellen und Erstellen verwendet das SDK ein kleineres portierbares RID-Diagramm. Der RuntimeInformation.RuntimeIdentifiergibt die Plattform zurück, für die die Runtime erstellt wurde. Zur Laufzeit findet .NET RID-spezifische Ressourcen anhand einer bekannten Gruppe portierbarer RIDs. Beim Erstellen einer Anwendung mit RID-spezifischen Ressourcen, die zur Laufzeit ignoriert werden können, gibt das SDK eine Warnung aus: NETSDK1206.

Laden von Ressourcen für eine bestimmte Betriebssystemversion oder -distribution

.NET versucht nicht mehr, erstklassige Unterstützung für die Auflösung von Abhängigkeiten bereitzustellen, die für eine Betriebssystemversion oder -distribution spezifisch sind. Wenn Ihre Anwendung oder Ihr Paket je nach Betriebssystemversion oder -distribution unterschiedliche Ressourcen laden muss, sollte die Logik zum bedingten Laden von Ressourcen implementiert werden.

Verwenden Sie System.OperatingSystem-APIs, um Informationen über die Plattform abzurufen. Unter Windows und macOS gibt Environment.OSVersiondie Betriebssystemversion zurück. Unter Linux kann sich um die Kernelversion handeln – der empfohlene Ansatz zum Abrufen des Linux-Distributionsnamens und der Version besteht darin, die Datei /etc/os-release zu lesen.

.NET bietet verschiedene Erweiterungspunkte zum Anpassen der Ladelogik, z. B. NativeLibrary.SetDllImportResolver(Assembly, DllImportResolver), AssemblyLoadContext.ResolvingUnmanagedDll, AssemblyLoadContext.Resolving und AppDomain.AssemblyResolve. Diese können verwendet werden, um die Ressource zu laden, die der aktuellen Plattform entspricht.

Bekannte RIDs

Die folgende Liste enthält eine kleine Untergruppe der am häufigsten verwendeten RIDs für jedes Betriebssystem. Prüfen Sie die Datei PortableRuntimeIdentifierGraph.json im dotnet/sdk-Repository auf die neueste und vollständige Version.

RIDs für Windows

  • win-x64
  • win-x86
  • win-arm64

Weitere Informationen finden Sie unter .NET-Abhängigkeiten und -Anforderungen.

RIDs für Linux

  • linux-x64 (Die meisten Desktopdistributionen wie CentOS, Debian, Fedora, Ubuntu und Ableitungen)
  • linux-musl-x64 (Einfache Distributionen mit musl wie Alpine Linux)
  • linux-musl-arm64 (Wird verwendet, um Docker-Images für 64-Bit-Arm v8- und minimalistische Basisimages zu erstellen)
  • linux-arm (Linux-Distributionen, die auf ARM basieren, wie Raspbian auf Raspberry Pi Model 2 und höher)
  • linux-arm64 (Linux-Distributionen, die auf 64-Bit-ARM basieren, wie Ubuntu Server mit 64 Bit auf Raspberry Pi Model 3 und höher)
  • linux-bionic-arm64 (Verteilungen mit der bionischen Libc von Android, z. B. Termux)

Weitere Informationen finden Sie unter .NET-Abhängigkeiten und -Anforderungen.

Relative IDs für macOS

Relative IDs für macOS verwenden das ältere Branding „OSX“.

  • osx-x64 (Mindestversion des Betriebssystems ist macOS 10.12 Sierra)
  • osx-arm64

Weitere Informationen finden Sie unter .NET-Abhängigkeiten und -Anforderungen.

iOS-RIDs

  • ios-arm64

Android-RIDs

  • android-arm64

Siehe auch