Runtimespezifische Apps nicht mehr eigenständig

Runtimespezifische Apps oder .NET-Apps mit einem RuntimeIdentifier sind standardmäßig nicht mehr eigenständig. Stattdessen sind sie standardmäßig frameworkabhängig.

Dies ist ein Breaking Change in den folgenden Situationen:

  • Wenn Sie Ihre App bereitgestellt, verteilt oder veröffentlicht haben und die SelfContained-Eigenschaft nicht explizit hinzugefügt haben, aber auch nicht erforderlich war, dass die .NET-Runtime auf dem Computer installiert ist, damit sie funktioniert. In diesem Fall haben Sie sich möglicherweise auf das vorherige Verhalten verlassen, um standardmäßig eine eigenständige App zu erstellen.
  • Wenn Sie sich auf das IL Link-Tool verlassen. Führen Sie in diesem Fall die unter Empfohlenen Aktion beschriebenen Schritte aus, um IL Link erneut zu verwenden.

Vorheriges Verhalten

Wenn zuvor ein Runtimebezeichner (RID) (über RuntimeIdentifier) angegeben wurde, wurde die App als eigenständig veröffentlicht, auch wenn SelfContained nicht explizit angegeben wurde.

Zusätzlich:

  • Wenn PublishSelfContained nicht explizit auf false festgelegt wurde, implizierten die Veröffentlichungseigenschaften PublishSingleFile und PublishAot einen RuntimeIdentifier und daher SelfContained (wenn nicht angegeben wurde) bei Vorgängen wie dotnet build, dotnet restore und dotnet publish.
  • Die PublishTrimmed-Eigenschaft implizierte SelfContained nicht.
  • Die PublishReadyToRun-Eigenschaft implizierte SelfContained, wenn SelfContained nicht angegeben wurde.

Neues Verhalten

Ab .NET 8 impliziert RuntimeIdentifier für Apps, die .NET 8 oder eine höhere Version als Ziel verwenden, SelfContained standardmäßig nicht mehr. Stattdessen sind Apps, die einen Runtimebezeichner angeben, standardmäßig von der .NET-Runtime abhängig (frameworkabhängig). Apps, die auf .NET 7 oder frühere Versionen ausgerichtet sind, sind nicht betroffen.

Zusätzlich:

  • Wenn PublishSelfContained nicht explizit auf false festgelegt ist, implizieren PublishSingleFile die Veröffentlichungseigenschaften PublishAot und SelfContained jetzt (sofern nicht angegeben) nur während dotnet publish (d. h. nicht für dotnet build oder dotnet restore).
  • Die PublishTrimmed-Eigenschaft impliziert SelfContained jetzt auch während dotnet publish.
  • Die PublishReadyToRun-Eigenschaft impliziert SelfContained nicht mehr, wenn das Projekt auf .NET 8 oder höher ausgerichtet ist.

Hinweis

Wenn Sie msbuild /t:Publish für die Veröffentlichung verwenden und Ihre App eigenständig sein soll, müssen Sie SelfContained explizit angeben, auch wenn Ihr Projekt über eine der aufgeführten Veröffentlichungseigenschaften verfügt.

Eingeführt in Version

.NET 8 Vorschauversion 5

Typ des Breaking Changes

Diese Änderung kann sich auf Quellkompatibilität und binäre Kompatibilität auswirken.

Grund für die Änderung

  • Das neue Verhalten des .NET SDK entspricht dem Visual Studio-Verhalten.
  • Frameworkabhängige Apps sind standardmäßig kleiner, da keine Kopien von .NET in jeder App gespeichert sind.
  • Wenn .NET außerhalb der App (d. h. für frameworkabhängige Bereitstellungen) verwaltet wird, bleibt .NET sicherer und aktueller. Apps, die über eine eigene Kopie der Runtime verfügen, erhalten keine Sicherheitsupdates. Durch diese Änderung sind standardmäßig mehr Apps frameworkabhängig.
  • Im Idealfall sind Befehlszeilenoptionen orthogonal. In diesem Fall unterstützen die Tools sowohl die RID-spezifische eigenständige Bereitstellung (SCD) als auch die RID-spezifische frameworkabhängige Bereitstellung (FDD). Es war also nicht sinnvoll, dass kein RID standardmäßig FDD und ein RID standardmäßig SCD bedeutete. Dieses Verhalten war für Benutzer*innen oft verwirrend.

.NET 6 hat Benutzer*innen mit der folgenden Warnung vor diesem Breaking Change gewarnt:

Warnung NETSDK1179: Eine der Optionen „--self-contained“ oder „--no-self-contained“ ist erforderlich, wenn „--runtime“ verwendet wird.

Nachdem Kund*innen nun Zeit hatten, SelfContained explizit hinzuzufügen, kann diese Änderung bedenkenlos eingeführt werden.

  • Wenn Sie .NET 7 oder eine frühere Version verwenden und das vorherige Verhalten genutzt haben, bei dem SelfContained abgeleitet wurde, wird diese Warnung angezeigt:

    Für Projekte mit TargetFrameworks >= 8.0 gibt RuntimeIdentifier nicht mehr automatisch eine SelfContained-App an. Wenn Sie nach dem Upgrade auf 8.0 weiterhin eine .NET Framework-unabhängige App erstellen möchten, müssen Sie SelfContained explizit festlegen.

    Befolgen Sie die Anleitungen der Warnung, und deklarieren Sie Ihre App als eigenständig. Sie können dies entweder in der Projektdatei oder als Befehlszeilenargument ausführen, z. B. dotnet publish --self-contained.

  • Wenn Sie .NET 8 verwenden und das vorherige Verhalten beibehalten möchten, legen Sie SelfContained wie zuvor beschrieben auf true fest.

Festlegen der Projektdateieigenschaft

SelfContained ist eine MSBuild-Eigenschaft, die Sie in die Projektdatei einfügen können, bei der es sich um eine Datei mit der Erweiterung .csproj, .vbproj oder .fsproj handelt. Legen Sie die Eigenschaft wie folgt fest:

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

Weitere Informationen