Delen via


Systeemeigen AOT-implementatie

Het publiceren van uw app als systeemeigen AOT- produceert een app die zelfstandig is en die vooraf gecompileerd is naar systeemeigen code. Systeemeigen AOT-apps hebben snellere opstarttijd en kleinere geheugenvoetafdrukken. Deze apps kunnen worden uitgevoerd op computers waarop de .NET Runtime niet is geïnstalleerd.

Het voordeel van Native AOT is het meest significant voor workloads met een groot aantal ingezette exemplaren, zoals cloudinfrastructuur en hyperscale-diensten. .NET 8 voegt ASP.NET Core-ondersteuning toe voor systeemeigen AOT-.

Het systeemeigen AOT-implementatiemodel maakt gebruik van een vooraf geschreven compiler om IL te compileren naar systeemeigen code op het moment van publiceren. Systeemeigen AOT-apps gebruiken geen Just-In-Time-compiler (JIT) wanneer de toepassing wordt uitgevoerd. Systeemeigen AOT-apps kunnen worden uitgevoerd in beperkte omgevingen waar een JIT niet is toegestaan. Systeemeigen AOT-toepassingen richten zich op een specifieke runtime-omgeving, zoals Linux x64 of Windows x64, net als bij het publiceren van een zelfstandige app.

Benodigdheden

Visual Studio 2022 of hoger, inclusief de desktopontwikkeling met C++ -workload met alle standaardonderdelen.

Systeemeigen AOT publiceren met behulp van de CLI

  1. Voeg <PublishAot>true</PublishAot> toe aan uw projectbestand.

    Met deze eigenschap wordt systeemeigen AOT-compilatie ingeschakeld tijdens het publiceren. Het maakt ook dynamische analyse van codegebruik mogelijk tijdens het bouwen en bewerken. Het verdient de voorkeur om deze instelling in het projectbestand te plaatsen in plaats van deze door te geven op de opdrachtregel, omdat het gedrag regelt buiten het publiceren.

    <PropertyGroup>
        <PublishAot>true</PublishAot>
    </PropertyGroup>
    
  2. Publiceer de app voor een specifieke runtime-id met behulp van dotnet publish -r <RID>.

    In het volgende voorbeeld wordt de app voor Windows gepubliceerd als een systeemeigen AOT-toepassing op een computer waarop de vereiste vereisten zijn geïnstalleerd.

    dotnet publish -r win-x64 -c Release

    In het volgende voorbeeld wordt de app voor Linux gepubliceerd als een systeemeigen AOT-toepassing. Een systeemeigen AOT-binair bestand dat op een Linux-computer wordt geproduceerd, werkt alleen op dezelfde of nieuwere Linux-versie. Systeemeigen AOT-binair geproduceerd op Ubuntu 20.04 wordt bijvoorbeeld uitgevoerd op Ubuntu 20.04 en hoger, maar wordt niet uitgevoerd op Ubuntu 18.04.

    dotnet publish -r linux-arm64 -c Release

De app is beschikbaar in de publicatiemap en bevat alle code die nodig is om erin uit te voeren, inclusief een stripped down-versie van de coreclr-runtime.

Bekijk de Native AOT-voorbeelden beschikbaar in de dotnet/samples-repository op GitHub. De voorbeelden omvatten Linux- en Windows Dockerfiles die laten zien hoe u de installatie van vereisten automatiseert en .NET-projecten publiceert met systeemeigen AOT met behulp van containers.

AOT-compatibiliteitsanalyses

De eigenschap IsAotCompatible wordt gebruikt om aan te geven of een bibliotheek compatibel is met systeemeigen AOT. Overweeg wanneer een bibliotheek de eigenschap IsAotCompatible instelt op true, bijvoorbeeld:

<PropertyGroup>
    <IsAotCompatible>true</IsAotCompatible>
</PropertyGroup>

Met de voorgaande configuratie wordt een standaardwaarde van true toegewezen aan de volgende eigenschappen:

  • IsTrimmable
  • EnableTrimAnalyzer
  • EnableSingleFileAnalyzer
  • EnableAotAnalyzer

Deze analyses helpen ervoor te zorgen dat een bibliotheek compatibel is met systeemeigen AOT.

Controleer of de assemblies waarnaar wordt verwezen compatibel zijn met AOT

Wanneer u AOT-analyse inschakelt voor een bibliotheek, kunt u desgewenst verificatie inschakelen dat alle assembly's waarnaar wordt verwezen, ook worden geannoteerd voor AOT-compatibiliteit door de VerifyReferenceAotCompatibility eigenschap in te stellen op true:

<PropertyGroup>
  <IsAotCompatible>true</IsAotCompatible>
  <VerifyReferenceAotCompatibility>true</VerifyReferenceAotCompatibility>
</PropertyGroup>

Wanneer deze eigenschap is ingeschakeld, waarschuwt de analyse voor eventuele assembly's waarnaar wordt verwezen en die geen metagegevens hebben IsAotCompatible . Dit helpt ervoor te zorgen dat alle afhankelijkheden in uw project worden geannoteerd voor systeemeigen AOT-compatibiliteit. De waarschuwing die wordt verzonden, is IL3058.

Deze verificatie is opt-in omdat:

  • Niet alle AOT-compatibele bibliotheken zijn bijgewerkt om de IsAotCompatible metagegevens op te nemen.
  • De waarschuwing kan luidruchtig zijn als u veel afhankelijkheden hebt die correct werken met systeemeigen AOT, maar niet expliciet als zodanig zijn gemarkeerd.

Opmerking

De metagegevens van de IsAotCompatible assembly zijn geïntroduceerd in .NET 10. Bibliotheken die zijn gepubliceerd op basis van eerdere versies van .NET, hebben dit kenmerk niet, zelfs niet als ze zijn gemaakt met <IsAotCompatible>true</IsAotCompatible>.

Overweeg deze verificatie in te schakelen wanneer u ervoor wilt zorgen dat al uw afhankelijkheden expliciet zijn gemarkeerd als AOT-compatibel door hun auteurs.

Systeemeigen foutopsporingsgegevens

Standaard produceert systeemeigen AOT-publicatie foutopsporingsgegevens in een afzonderlijk bestand:

  • Linux: .dbg
  • Windows: .pdb-
  • macOS: map .dSYM

Het foutopsporingsbestand is nodig voor het uitvoeren van de app onder het foutopsporingsprogramma of het inspecteren van crashdumps. Stel op Unix-achtige platforms de eigenschap StripSymbols in op false om de foutopsporingsgegevens in het systeemeigen binaire bestand op te nemen. Als u foutopsporingsinformatie opgeeft, wordt het systeemeigen binaire bestand groter.

<PropertyGroup>
    <StripSymbols>false</StripSymbols>
</PropertyGroup>

Beperkingen van systeemeigen AOT-implementatie

Systeemeigen AOT-apps hebben de volgende beperkingen:

  • Geen dynamisch laden, bijvoorbeeld Assembly.LoadFile.
  • Bijvoorbeeld, geen runtimecodegeneratie System.Reflection.Emit.
  • Geen C++/CLI.
  • Windows: Geen ingebouwde COM.
  • Vereist bijsnijden, wat beperkingen heeft.
  • Impliceert compilatie in één bestand, dat bekend is incompatibiliteit.
  • Apps bevatten vereiste runtimebibliotheken (net als zelfstandige apps, waardoor hun grootte wordt verhoogd in vergelijking met frameworkafhankelijke apps).
  • System.Linq.Expressions gebruik altijd hun geïnterpreteerde formulier, wat langzamer is dan door runtime gegenereerde gecompileerde code.
  • Algemene parameters die worden vervangen door structtypeargumenten, hebben speciale code gegenereerd voor elke instantie. In de dynamische runtime worden veel instantiations gegenereerd op aanvraag. In Native AOT worden alle instantiëringen vooraf gegenereerd. Dit kan aanzienlijke gevolgen hebben voor de schijfgrootte van de toepassing. Algemene virtuele methoden en algemene exemplaarmethoden zullen ook een instantiering hebben voor elk implementatie- of overschrijdingstype.
  • Niet alle runtimebibliotheken worden volledig geannoteerd om systeemeigen AOT-compatibel te zijn. Dat wil gezegd, sommige waarschuwingen in de runtimebibliotheken kunnen niet worden uitgevoerd door eindontwikkelaars.
  • Diagnostische ondersteuning voor foutopsporing en profilering met enkele beperkingen.
  • Ondersteuning voor sommige ASP.NET Core-functies. Voor meer informatie, zie ASP.NET Core-ondersteuning voor systeemeigen AOT.

Het publicatieproces analyseert het hele project en de bijbehorende afhankelijkheden voor mogelijke beperkingen. Er worden waarschuwingen gegeven voor elke beperking die de gepubliceerde app tijdens runtime kan tegenkomen.

Beperkingen voor platform/architectuur

In de volgende tabel ziet u ondersteunde compilatiedoelen.

Platvorm Ondersteunde architectuur Opmerkingen
Ramen x64, Arm64
Linux x64, Arm64
macOS x64, Arm64
Ios Arm64 Experimentele ondersteuning
iOSSimulator x64, Arm64 Experimentele ondersteuning
tvOS Arm64 Experimentele ondersteuning
tvOSSimulator x64, Arm64 Experimentele ondersteuning
MacCatalyst x64, Arm64 Experimentele ondersteuning
Androïde x64, Arm64 Experimenteel, geen ingebouwde Java-interoperabiliteit

Volg de koppeling in de tabel voor meer informatie over hoe specifiek platform wordt ondersteund met Native AOT.