Delen via


Runtime-specifieke apps zijn niet langer zelfstandig

Runtimespecifieke apps of .NET-apps met een RuntimeIdentifier zijn niet meer standaard zelfstandig. In plaats daarvan zijn ze standaard afhankelijk van het framework .

Dit is een belangrijke wijziging in de volgende situaties:

  • Als u uw app hebt geïmplementeerd, gedistribueerd of gepubliceerd en de SelfContained eigenschap niet expliciet hebt toegevoegd, maar ook niet vereist dat de .NET-runtime op de computer wordt geïnstalleerd, zodat deze werkt. In dit geval hebt u mogelijk gebruik gemaakt van het vorige gedrag om een zelfvoorzienende app standaard te produceren.
  • Als u afhankelijk bent van het hulpprogramma IL Link. In dit geval voert u de stappen uit die worden beschreven onder Aanbevolen actie om IL Link opnieuw te gebruiken.

Vorig gedrag

Indien eerder een runtime-identifier (RID) is opgegeven (via RuntimeIdentifier), werd de app gepubliceerd als zelfstandig uitvoerbaar, zelfs als SelfContained niet expliciet was opgegeven.

Bovendien:

  • Als PublishSelfContained niet expliciet is ingesteld op false, impliceren de publicatie-eigenschappen PublishSingleFile en PublishAot een RuntimeIdentifier en daarom ook SelfContained (als dit niet is opgegeven) tijdens operaties zoals dotnet build, dotnet restore en dotnet publish.
  • De PublishTrimmed eigenschap impliceerde SelfContained niet.
  • De PublishReadyToRun eigenschap impliceerde SelfContained als SelfContained niet is opgegeven.

Nieuw gedrag

Vanaf .NET 8 impliceert RuntimeIdentifier niet meer standaard SelfContained voor apps die zijn gericht op .NET 8 of een latere versie. In plaats daarvan zijn apps die een runtime-id opgeven, standaard afhankelijk van de .NET-runtime (frameworkafhankelijk). Apps waarop .NET 7 of eerdere versies zijn gericht, worden niet beïnvloed.

Bovendien:

  • Als PublishSelfContained niet expliciet is ingesteld op false, impliceren de publicatie-eigenschappen PublishSingleFile en PublishAot nu SelfContained (als dit niet is opgegeven) alleen tijdens dotnet publish (dat wil zeggen, niet voor dotnet build of dotnet restore).
  • De PublishTrimmed eigenschap impliceert SelfContained nu ook tijdens dotnet publish.
  • De PublishReadyToRun eigenschap impliceert SelfContained niet meer als het project is gericht op .NET 8 of hoger.

Opmerking

Als u met msbuild /t:Publish publiceert en u wilt dat uw app zelfstandig draait, moet u expliciet SelfContained aangeven, zelfs als uw project een van de opgesomde publicatiekenmerken heeft.

Geïntroduceerde versie

.NET 8 Preview 5

Type van brekende verandering

Deze wijziging kan van invloed zijn op de broncompatibiliteit en binaire compatibiliteit.

Reden voor wijziging

  • Het nieuwe .NET SDK-gedrag is afgestemd op het gedrag van Visual Studio.
  • Frameworkafhankelijke apps zijn standaard kleiner, omdat er geen kopieën van .NET zijn opgeslagen in elke app.
  • Wanneer .NET buiten de app wordt beheerd (dat wil gezegd, voor frameworkafhankelijke implementaties), blijft .NET veiliger en up-to-date. Apps die hun eigen exemplaar van de runtime hebben, krijgen geen beveiligingsupdates. Deze wijziging maakt meer apps bij voorbaat frameworkafhankelijk.
  • Idealiter zijn opdrachtregelopties orthogonaal. In dit geval ondersteunt de tooling zowel RID-specifieke zelf-ingesloten implementatie (SCD) als RID-specifieke frameworkafhankelijke implementatie (FDD). Het was dus niet logisch dat geen RID standaard op FDD stond en RID standaard op SCD. Dit gedrag was vaak verwarrend voor gebruikers.

.NET 6 waarschuwde gebruikers voor deze belangrijke wijziging met de volgende waarschuwing:

waarschuwing NETSDK1179: een van de opties '--self-contained' of '--no-self-contained' is vereist wanneer '--runtime' wordt gebruikt.

Nu klanten de tijd hebben gehad om SelfContained expliciet toe te voegen, is het goed om de onderbreking te introduceren.

  • Als u .NET 7 of een eerdere versie gebruikt en vertrouwde op het vorige gedrag waarbij SelfContained werd afgeleid, dan krijgt u deze waarschuwing te zien:

    Voor projecten met TargetFrameworks >= 8.0 geeft RuntimeIdentifier geen SelfContained-app meer automatisch. Als u wilt doorgaan met het maken van een onafhankelijke .NET Framework-app na een upgrade naar 8.0, kunt u SelfContained expliciet instellen.

    Volg de richtlijnen van de waarschuwing en declareer uw app als zelfstandig. U kunt dat doen in het projectbestand of als opdrachtregelargument, bijvoorbeeld dotnet publish --self-contained.

  • Als u .NET 8 gebruikt en het vorige gedrag wilt behouden, moet u deze op dezelfde manier instellen SelfContainedtrue als eerder beschreven.

Projectbestandseigenschap instellen

SelfContained is een MSBuild-eigenschap die u kunt invoegen in uw projectbestand. Dit is een bestand met de extensie .csproj, .vbproj of .fsproj . Stel de eigenschap als volgt in:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    ...
    <SelfContained>true</SelfContained>
  </PropertyGroup>
</Project>

Zie ook