Zum Inhalt springen

Windows-Installer für eine .NET-App erstellen (WPF, WinForms, Konsole)

Veröffentlichen Sie eine .NET-Desktop-App mit dotnet publish, wählen Sie zwischen frameworkabhängig und eigenständig und packen Sie den Publish-Ordner in eine Setup.exe mit Verknüpfungen und Deinstaller.

Aktualisiert am 31. Oktober 2026 · 3 Min. Lesezeit

Visual Studio baut Ihre WPF- oder WinForms-App, und dotnet publish liefert einen Ordner, der überall läuft. Was fehlt, ist der Installer: der Eintrag im Startmenü, der Ordner unter Program Files, der Deinstallationseintrag in den Windows-Einstellungen. Die alten ClickOnce und Visual Studio Installer Projects gibt es noch, aber beiden sieht man ihr Alter an. Hier ist der direkte Weg vom .NET-Projekt zur Setup.exe.

Schritt 1: App veröffentlichen

Das Veröffentlichen erzeugt einen Ordner mit allem, was die App braucht. Führen Sie den Befehl im Projektordner aus:

dotnet publish -c Release -r win-x64 --self-contained true

Die Ausgabe landet unter bin\Release\net8.0-windows\win-x64\publish\ (das Zielframework im Pfad hängt von Ihrem Projekt ab). Dieser Ordner ist das, was Sie ausliefern.

Die eine Entscheidung, auf die es ankommt:

  • Eigenständig (--self-contained true) bündelt die .NET-Laufzeit. Der Ordner ist 70 bis 150 MB groß, läuft aber auf jedem Windows-Rechner, ohne dass vorher etwas installiert werden muss. Wählen Sie dies für Software, die Sie an die Öffentlichkeit verteilen.
  • Frameworkabhängig (--self-contained false) ist nur wenige MB groß, aber der Nutzer muss die passende .NET Desktop Runtime installiert haben, sonst zeigt die App beim ersten Start eine Download-Aufforderung. Geeignet für interne Tools auf verwalteten Rechnern.

Nützliche Optionen:

  • -p:PublishReadyToRun=true kompiliert die App vorab für einen schnelleren Start.
  • -p:PublishSingleFile=true fasst die Ausgabe in einer einzigen .exe zusammen. Das funktioniert, aber ein Installer nimmt dem den Grund, und Einzeldatei-Apps entpacken native Bibliotheken beim ersten Start. Der normale Ordner ist einfacher.
  • Trimming (PublishTrimmed) wird für WPF und WinForms nicht unterstützt; lassen Sie es aus.

Legen Sie das App-Symbol in der Projektdatei fest, damit die veröffentlichte .exe es trägt:

<PropertyGroup>
  <ApplicationIcon>app.ico</ApplicationIcon>
</PropertyGroup>

Starten Sie die veröffentlichte .exe einmal aus dem Publish-Ordner, idealerweise auf einem Rechner ohne Visual Studio, um sicherzugehen, dass nichts fehlt.

Schritt 2: Publish-Ordner zippen

Zippen Sie den Inhalt von publish`: die .exe, die DLLs, .deps.json, .runtimeconfig.json und etwaige Inhaltsdateien. Lassen Sie .pdb`-Dateien weg, es sei denn, Sie möchten Absturzsymbole auf den Rechnern Ihrer Kunden.

Schritt 3: Installer bauen

  1. Laden Sie die Zip-Datei bei ExeTup hoch. Es wählt die .exe Ihrer App als Hauptprogramm; bestätigen Sie das, denn eine eigenständige Veröffentlichung enthält createdump.exe, und das ist es nicht.
  2. Tragen Sie Name, Version (halten Sie sie mit <Version> im Projekt synchron), Herausgeber und Lizenz ein.
  3. Wählen Sie alle Benutzer für eine klassische Desktop-App unter Program Files oder aktueller Benutzer, wenn Kunden möglicherweise keine Administratorrechte haben.
  4. Behalten Sie 64-Bit für eine win-x64-Veröffentlichung bei; wählen Sie 32-Bit für win-x86.
  5. Laden Sie dieselbe app.ico hoch, aktivieren Sie die Verknüpfungen und starten Sie den Build.

Laden Sie die Setup.exe herunter und testen Sie Installation und Deinstallation unter Windows.

Hinweise speziell zu .NET

  • Updates. Liefern Sie einen neuen Installer mit höherer Version aus. Die Installation über die alte Version ersetzt die Dateien; einen Auto-Update-Kanal enthält der Installer nicht.
  • Einstellungen und Daten. Schreiben Sie Nutzerdaten nach %APPDATA% oder %LOCALAPPDATA%, nicht neben die .exe. Program Files ist für normale Nutzer schreibgeschützt, und der Deinstaller entfernt nur, was er installiert hat.
  • Voraussetzungen. Eigenständige Veröffentlichungen brauchen nichts weiter. Benötigt Ihre App die Visual-C++-Laufzeit oder einen Datenbanktreiber, dokumentieren Sie das; der Installer kettet keine anderen Installer an.
  • Codesignatur. Signieren Sie die veröffentlichte .exe vor dem Zippen und anschließend die heruntergeladene Setup.exe. Siehe den SmartScreen-Leitfaden.

Alternativen

  • Visual Studio Installer Projects erzeugen MSI-Dateien direkt aus Visual Studio heraus. Weiterhin als Erweiterung verfügbar, eingeschränkt und umständlich bei eigenständigen Veröffentlichungen.
  • ClickOnce bietet Installationen pro Benutzer mit Auto-Update, gebunden an einen Webserver, den Sie betreiben.
  • WiX Toolset baut MSI-Dateien aus XML und ist der Standard für MSI-Paketierung auf Unternehmensniveau. Mächtig, mit entsprechend steiler Lernkurve.
  • MSIX ist Microsofts neueres Paketformat, am besten geeignet, wenn Sie den Microsoft Store anvisieren.

Wann das Format eine Rolle spielt, lesen Sie unter MSI- vs. EXE-Installer.

Häufige Fragen

Soll ich frameworkabhängig oder eigenständig veröffentlichen?

Eigenständig für alles, was Sie an die Öffentlichkeit geben, damit die App ohne Laufzeit-Download läuft. Frameworkabhängig für interne Tools auf Rechnern, auf denen die IT die .NET-Laufzeit verwaltet.

Enthält der Installer die .NET-Laufzeit?

Wenn Sie eigenständig veröffentlichen, ja, denn sie ist Teil des Publish-Ordners. Der Installer liefert aus, was in der Zip-Datei steckt.

Kann ich ein MSI für Gruppenrichtlinien erzeugen?

ExeTup baut eine Setup.exe. Sie installiert sich mit /S unbeaufsichtigt, was die meisten skriptgesteuerten Bereitstellungen abdeckt. Für Richtlinien, die ausschließlich MSI akzeptieren, ist WiX das richtige Werkzeug.

Mit welchen .NET-Versionen funktioniert das?

Mit allen, die einen Publish-Ordner erzeugen: .NET 6, 7, 8, 9 und neuer sowie .NET-Framework-Apps, die mit Visual Studio gebaut wurden (verwenden Sie die Ausgabe unter bin\Release).

Verwandte Anleitungen