Veröffentlichen von .NET-Apps mit der .NET-CLI

In diesem Artikel wird veranschaulicht, wie Sie Ihre .NET-Anwendung über die Befehlszeile veröffentlichen. .NET bietet drei Möglichkeiten zum Veröffentlichen Ihrer Anwendungen. Die frameworkabhängige Bereitstellung erzeugt eine plattformübergreifende DLL-Datei, die die lokal installierte .NET-Runtime verwendet. Die frameworkabhängige ausführbare Datei erzeugt eine plattformspezifische ausführbare Datei, die die lokal installierte .NET-Runtime verwendet. Die eigenständige ausführbare Datei erzeugt eine plattformspezifische ausführbare Datei, die eine lokale Kopie der .NET-Runtime enthält.

Eine Übersicht über diese Veröffentlichungsmodi finden Sie unter .NET-Anwendungsbereitstellung.

Benötigen Sie schnelle Hilfe zur Verwendung der CLI? In der folgenden Tabelle finden Sie einige Beispiele zum Veröffentlichen Ihrer App. Sie können das Zielframework mit dem -f <TFM>-Parameter oder durch Bearbeiten der Projektdatei festlegen. Weitere Informationen finden Sie in den Grundlagen der Veröffentlichung.

Veröffentlichungsmodus Get-Help
Framework-abhängige Bereitstellung dotnet publish -c Release -p:UseAppHost=false
Frameworkabhängige ausführbare Datei dotnet publish -c Release -r <RID> --self-contained false
dotnet publish -c Release
Eigenständige Bereitstellung dotnet publish -c Release -r <RID> --self-contained true

Hinweis

  • Der Parameter -c Release ist nicht erforderlich. Er wird als Erinnerung zum Veröffentlichen des Release-Builds Ihrer App bereitgestellt.
  • In .NET SDK 3.1 oder höher ist die frameworkabhängige ausführbare Datei der Standardveröffentlichungsmodus, wenn der Basisbefehl dotnet publish ausgeführt wird.

Grundlagen der Veröffentlichung

Die <TargetFramework>-Einstellung der Projektdatei gibt das Standardzielframework an, wenn Sie Ihre App veröffentlichen. Sie können das Zielframework in einen beliebigen, gültigen Zielframeworkmoniker (TFM) ändern. Wenn Sie in Ihrem Projekt beispielsweise <TargetFramework>net8.0</TargetFramework> verwenden, wird eine Binärdatei für .NET 8 erstellt. Der mit dieser Einstellung festgelegte TFM ist das Standardziel des dotnet publish-Befehls.

Sie können mehrere durch Semikolons getrennte TFM-Werte in der <TargetFrameworks>-Einstellung festlegen, wenn Sie mehr als ein Zielframework benötigen. Wenn Sie die App erstellen, wird für jedes Zielframework ein Build erstellt. Wenn Sie jedoch die App veröffentlichen, müssen Sie das Zielframework mit dem dotnet publish -f <TFM>-Befehl angeben.

Der BUILD-CONFIGURATION-Standardmodus ist Debug, sofern er nicht mithilfe des -c-Parameters geändert wurde.

Das Standardausgabeverzeichnis des dotnet publish-Befehls lautet ./bin/<BUILD-CONFIGURATION>/<TFM>/publish/. Zum Beispiel wird mit dotnet publish -c Release -f net8.0 in ./bin/Release/net8.0/publish/ veröffentlicht. Sie können jedoch für alle Buildausgaben einen vereinfachten Ausgabepfad und eine vereinfachte Ordnerstruktur wählen. Weitere Informationen finden Sie unter Artefakte – Ausgabelayout.

Native Abhängigkeiten

Wenn Ihre App über native Abhängigkeiten verfügt, kann sie auf anderen Betriebssystemen möglicherweise nicht ausgeführt werden. Wenn Ihre App beispielsweise die native Windows-API verwendet, kann sie nicht unter macOS oder Linux ausgeführt werden. In diesem Fall müssten Sie plattformspezifischen Code bereitstellen und eine ausführbare Datei für jede Plattform kompilieren.

Beachten Sie außerdem, dass Ihre App möglicherweise nicht auf jeder Plattform ausgeführt werden kann, wenn Sie auf eine Bibliothek verwiesen haben, die eine native Abhängigkeit aufweist. Es ist jedoch möglich, dass ein NuGet-Paket, auf das Sie verweisen, plattformspezifische Versionen enthält, um die erforderlichen nativen Abhängigkeiten für Sie zu verarbeiten.

Beim Verteilen einer App mit nativen Abhängigkeiten müssen Sie möglicherweise den dotnet publish -r <RID>-Switch verwenden, um die Zielplattform für Ihre Veröffentlichung anzugeben. Eine Liste der Runtimebezeichner (RID) finden Sie im RID-Katalog.

Weitere Informationen zu plattformspezifischen Binärdateien finden Sie in den Abschnitten Frameworkabhängige ausführbare Datei und Eigenständige Bereitstellung.

Beispiel-App

Sie können die folgende App zum Kennenlernen der Veröffentlichungsbefehle verwenden. Erstellen Sie die App, indem Sie die folgenden Befehle im Terminal ausführen:

mkdir apptest1
cd apptest1
dotnet new console
dotnet add package Figgle

Sie müssen den Inhalt der von der Konsolenvorlage erstellten Program.cs- oder Program.vb-Datei in Folgenden ändern:

using System;

namespace apptest1
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(Figgle.FiggleFonts.Standard.Render("Hello, World!"));
        }
    }
}
Module Program
    Sub Main(args As String())
        Console.WriteLine(Figgle.FiggleFonts.Standard.Render("Hello, World!"))
    End Sub
End Module

Wenn Sie die App ausführen (dotnet run), wird die folgende Ausgabe angezeigt:

  _   _      _ _         __        __         _     _ _
 | | | | ___| | | ___    \ \      / /__  _ __| | __| | |
 | |_| |/ _ \ | |/ _ \    \ \ /\ / / _ \| '__| |/ _` | |
 |  _  |  __/ | | (_) |    \ V  V / (_) | |  | | (_| |_|
 |_| |_|\___|_|_|\___( )    \_/\_/ \___/|_|  |_|\__,_(_)
                     |/

Framework-abhängige Bereitstellung

Wenn Sie Ihre App als frameworkabhängige Bereitstellung veröffentlichen, wird eine <PROJECT-NAME>.dll-Datei im ./bin/<BUILD-CONFIGURATION>/<TFM>/publish/-Ordner erstellt. Navigieren Sie zum Ausgabeordner, und verwenden Sie den Befehl dotnet <PROJECT-NAME>.dll, um Ihre App auszuführen.

Ihre App wird für eine bestimmte Version von .NET konfiguriert. Die .NET-Zielruntime ist auf jedem Computer erforderlich, auf dem Ihre App ausgeführt wird. Wenn Ihre App beispielsweise auf .NET Core 8 ausgerichtet ist, muss .NET Core 8-Runtime auf Computern installiert sein, auf denen Ihre App ausgeführt werden soll. Sie können Ihre Projektdatei wie im Abschnitt Grundlagen der Veröffentlichung beschrieben bearbeiten, um das Standardzielframework zu ändern oder mehr als ein Zielframework einzurichten.

Beim Veröffentlichen einer frameworkabhängigen Bereitstellung wird eine App erstellt, die automatisch ein Rollforward auf den neuesten .NET-Sicherheitspatch ausführt, der auf dem System verfügbar ist. Weitere Informationen über die Versionsbindung zur Kompilierzeit finden Sie unter .NET-Versionsauswahl.

Veröffentlichungsmodus Get-Help
Framework-abhängige Bereitstellung dotnet publish -c Release -p:UseAppHost=false

Frameworkabhängige ausführbare Datei

Die frameworkabhängige ausführbare Datei ist der Standardmodus des Basisbefehls dotnet publish. Sie müssen keine weiteren Parameter festlegen, wenn Sie das aktuelle Betriebssystem als Ziel verwenden möchten.

In diesem Modus wird ein Host für die plattformspezifische ausführbare Datei erstellt, der Ihre plattformübergreifende App hostet. Dieser Modus ähnelt der frameworkabhängigen Bereitstellung, da dabei ein Host in Form des dotnet-Befehls erforderlich ist. Der Dateiname des ausführbaren Hosts variiert je nach Plattform. Der Name sollte <PROJECT-FILE>.exe ähnlich sein. Sie können diese ausführbare Datei direkt ausführen, anstatt dotnet <PROJECT-FILE>.dll aufzurufen, was jedoch auch eine akzeptable Möglichkeit zum Ausführen der App darstellt.

Ihre App wird für eine bestimmte Version von .NET konfiguriert. Die .NET-Zielruntime ist auf jedem Computer erforderlich, auf dem Ihre App ausgeführt wird. Wenn Ihre App beispielsweise auf .NET Core 8 ausgerichtet ist, muss .NET Core 8-Runtime auf Computern installiert sein, auf denen Ihre App ausgeführt werden soll. Sie können Ihre Projektdatei wie im Abschnitt Grundlagen der Veröffentlichung beschrieben bearbeiten, um das Standardzielframework zu ändern oder mehr als ein Zielframework einzurichten.

Beim Veröffentlichen einer frameworkabhängigen ausführbaren Datei wird eine App erstellt, die automatisch ein Rollforward auf den neuesten .NET-Sicherheitspatch ausführt, der auf dem System verfügbar ist. Weitere Informationen über die Versionsbindung zur Kompilierzeit finden Sie unter .NET-Versionsauswahl.

Veröffentlichungsmodus Get-Help
Frameworkabhängige ausführbare Datei dotnet publish -c Release -r <RID> --self-contained false
dotnet publish -c Release

Wenn Sie den -r-Switch verwenden, wird der Pfad des Ausgabeordner in folgenden geändert: ./bin/<BUILD-CONFIGURATION>/<TFM>/<RID>/publish/

Führen Sie dotnet publish -f net6.0 -r win-x64 --self-contained false aus, wenn Sie die Beispiel-App verwenden. Mit diesem Befehl wird die folgende ausführbare Datei erstellt: ./bin/Debug/net6.0/win-x64/publish/apptest1.exe

Hinweis

Sie können die Gesamtgröße Ihrer Bereitstellung reduzieren, indem Sie den invarianten Globalisierungsmodus aktivieren. Dieser Modus eignet sich für Anwendungen, die nicht für den globalen Einsatz ausgelegt sind, und Formatierungskonventionen, Groß-/Kleinschreibungskonventionen, Zeichenfolgenvergleiche und Sortierreihenfolgen der invarianten Kultur verwenden können. Weitere Informationen zum invarianten Globalisierungsmodus und seiner Aktivierung finden Sie unter .NET Globalization Invariant Mode (Invarianter Globalisierungsmodus von .NET).

Konfigurieren des Suchverhaltens der .NET-Installation

In .NET 9 und höher können Sie die .NET-Installationssuchpfade der veröffentlichten ausführbaren Datei über die Eigenschaften AppHostDotNetSearch und AppHostRelativeDotNet konfigurieren.

AppHostDotNetSearch ermöglicht die Angabe eines oder mehrerer Speicherorte, an denen die ausführbare Datei nach einer .NET-Installation sucht:

  • AppLocal: Ordner der ausführbaren Datei der App
  • AppRelative: relativer Pfad der ausführbaren Datei der App
  • EnvironmentVariables: Wert der DOTNET_ROOT[_<arch>]-Umgebungsvariablen
  • Global: registrierte und standardmäßige globale Installationsspeicherorte

AppHostRelativeDotNet gibt den relativen Pfad der ausführbaren Datei an, die gesucht wird, wenn AppHostDotNetSearch AppRelative enthält.

Weitere Informationen finden Sie unter AppHostDotNetSearch, AppHostRelativeDotNet und Optionen für Installationsspeicherorte in apphost.

Eigenständige Bereitstellung

Wenn Sie eine eigenständige Bereitstellung veröffentlichen, erstellt das .NET SDK eine plattformspezifische ausführbare Datei. Die Veröffentlichung einer eigenständigen Bereitstellung (SCD) umfasst alle erforderlichen .NET-Dateien zum Ausführen Ihrer App, aber nicht die nativen Abhängigkeiten von .NET (z. B. für .NET 6 unter Linux oder .NET 8 unter Linux). Diese Abhängigkeiten müssen auf dem System vorhanden sein, bevor die App ausgeführt wird.

Beim Veröffentlichen einer eigenständigen Bereitstellung wird eine App erstellt, für die kein Rollforward auf den neuesten verfügbaren .NET-Sicherheitspatch ausgeführt wird. Weitere Informationen über die Versionsbindung zur Kompilierzeit finden Sie unter .NET-Versionsauswahl.

Sie müssen die folgenden Parameter mit dem dotnet publish-Befehl verwenden, um eine eigenständige Bereitstellung zu veröffentlichen:

  • -r <RID>

    Dieser Switch verwendet einen Bezeichner (RID), um die Zielplattform anzugeben. Eine Liste der Runtimebezeichner (RID) finden Sie im RID-Katalog.

  • --self-contained true

    Dieser Schalter weist das .NET Core SDK an, eine ausführbare Datei als eigenständige Bereitstellung zu erstellen.

Veröffentlichungsmodus Get-Help
Eigenständige Bereitstellung dotnet publish -c Release -r <RID> --self-contained true

Tipp

  • In .NET 6 und höheren Versionen können Sie die Gesamtgröße kompatibler eigenständiger Apps durch gekürzte Veröffentlichung reduzieren. Dabei kann der Trimmer Teile des Frameworks und referenzierte Assemblys entfernen, die sich weder in einem Codepfad befinden noch potenziell in der Runtimereflexion referenziert werden. Unter Bekannte Kürzungsinkompatibilitäten erfahren Sie, ob das Kürzen für Ihre Anwendung sinnvoll ist.
  • Sie können die Gesamtgröße Ihrer Bereitstellung reduzieren, indem Sie den invarianten Globalisierungsmodus aktivieren. Dieser Modus eignet sich für Anwendungen, die nicht für den globalen Einsatz ausgelegt sind, und Formatierungskonventionen, Groß-/Kleinschreibungskonventionen, Zeichenfolgenvergleiche und Sortierreihenfolgen der invarianten Kultur verwenden können. Weitere Informationen zum invarianten Globalisierungsmodus und seiner Aktivierung finden Sie unter .NET Core Globalization Invariant Mode (Invarianter Globalisierungsmodus von .NET Core).

Weitere Informationen