本文へスキップ

.NET アプリ(WPF・WinForms・コンソール)の Windows インストーラーを作る

dotnet publish で .NET デスクトップアプリを発行し、フレームワーク依存と自己完結型のどちらかを選び、発行フォルダーをショートカットとアンインストーラー付きの Setup.exe にまとめる手順。

更新日 2026年10月31日 · 読了 6 分

Visual Studio が WPF や WinForms のアプリをビルドし、dotnet publish はどこでも動くフォルダーを出力してくれます。足りないのはインストーラーです。スタートメニューの項目、Program Files のフォルダー、Windows の設定に表示されるアンインストールの項目。昔ながらの ClickOnce や Visual Studio Installer Projects は今も存在しますが、どちらも古さが目立ちます。ここでは、.NET プロジェクトから Setup.exe に至る最短の道筋を紹介します。

ステップ 1:アプリを発行する

発行すると、アプリに必要なものがすべて入ったフォルダーが生成されます。プロジェクトフォルダーで次を実行します。

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

出力は bin\Release\net8.0-windows\win-x64\publish\ に生成されます(パス中のターゲットフレームワークはプロジェクトによって異なります)。このフォルダーが配布物です。

重要な判断はひとつだけです。

  • 自己完結型(--self-contained true)は .NET ランタイムを同梱します。フォルダーは 70〜150 MB になりますが、事前に何もインストールしなくても、どの Windows マシンでも動作します。一般に配布するソフトウェアにはこちらを選びます。
  • フレームワーク依存(--self-contained false)は数 MB で済みますが、ユーザーのマシンに対応する .NET Desktop Runtime がインストールされている必要があり、ない場合は初回起動時にダウンロードを促す画面が表示されます。管理されたマシンで使う社内ツールには十分です。

便利なオプション:

  • -p:PublishReadyToRun=true はアプリを事前コンパイルし、起動を速くします。
  • -p:PublishSingleFile=true は出力を 1 つの .exe にまとめます。動作はしますが、インストーラーがあれば使う理由がなくなりますし、単一ファイルのアプリは初回実行時にネイティブライブラリを展開します。通常のフォルダーのほうがシンプルです。
  • トリミング(PublishTrimmed)は WPF と WinForms ではサポートされていません。オフのままにしてください。

発行された .exe にアイコンが埋め込まれるよう、プロジェクトファイルでアプリのアイコンを設定します。

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

発行された .exe を発行フォルダーから一度実行し、不足がないことを確認してください。できれば Visual Studio の入っていないマシンで行うのが理想です。

ステップ 2:発行フォルダーを zip 圧縮する

publish` の*中身*を zip 圧縮します。.exe、各 DLL、.deps.json、.runtimeconfig.json、そしてコンテンツファイルがあればそれも含めます。顧客のマシンにクラッシュ用シンボルを置きたい場合を除き、.pdb` ファイルは除外してください。

ステップ 3:インストーラーをビルドする

  1. zip を ExeTup にアップロードします。アプリの .exe がメインプログラムとして選ばれますが、自己完結型の発行には createdump.exe も含まれており、それはメインプログラムではないので、選択を確認してください。
  2. 名前、バージョン(プロジェクトの <Version> と揃えておきます)、発行元、ライセンスを入力します。
  3. Program Files に入れる従来型のデスクトップアプリならすべてのユーザーを、顧客に管理者権限がない可能性があるなら現在のユーザーを選びます。
  4. win-x64 の発行なら 64 ビットのままにし、win-x86 なら 32 ビットを選びます。
  5. 同じ app.ico をアップロードし、ショートカットを有効にして、ビルドします。

Setup.exe をダウンロードし、Windows 上でインストールとアンインストールをテストしてください。

.NET 固有の注意点

  • 更新。より高いバージョンの新しいインストーラーを配布します。旧バージョンの上にインストールするとファイルが置き換えられます。インストーラーに自動更新の仕組みは含まれません。
  • 設定とデータ。ユーザーデータは .exe の隣ではなく、%APPDATA% または %LOCALAPPDATA% に書き込んでください。Program Files は一般ユーザーには読み取り専用であり、アンインストーラーは自身がインストールしたものしか削除しません。
  • 前提条件。自己完結型の発行には他に何も必要ありません。アプリが Visual C++ ランタイムやデータベースドライバーを必要とする場合は、その旨をドキュメントに書いてください。インストーラーは他のインストーラーを連鎖実行しません。
  • コード署名。zip 圧縮する前に発行された .exe に署名し、その後ダウンロードした Setup.exe に署名します。SmartScreen のガイドを参照してください。

代替手段

  • Visual Studio Installer Projects は Visual Studio の中から MSI ファイルを生成します。拡張機能として今も入手できますが、機能が限られ、自己完結型の発行とは相性がよくありません。
  • ClickOnce は自動更新付きのユーザー単位インストールを提供しますが、自分で運用する Web サーバーに縛られます。
  • WiX Toolset は XML から MSI ファイルをビルドし、エンタープライズ級の MSI パッケージングの標準です。強力ですが、それに見合った学習コストがかかります。
  • MSIX は Microsoft の比較的新しいパッケージ形式で、Microsoft Store を対象にする場合に最適です。

形式が重要になる場面については、MSI と EXE インストーラーの違いを参照してください。

よくある質問

フレームワーク依存と自己完結型のどちらで発行すべきですか?

一般に提供するものはすべて自己完結型にし、ランタイムのダウンロードなしでアプリが動くようにします。IT 部門が .NET ランタイムを管理しているマシンで使う社内ツールならフレームワーク依存で構いません。

インストーラーに .NET ランタイムは含まれますか?

自己完結型で発行した場合は含まれます。発行フォルダーの一部だからです。インストーラーは zip に入っているものをそのまま配布します。

グループポリシー用に MSI を作れますか?

ExeTup がビルドするのは Setup.exe です。/S でサイレントインストールでき、スクリプトによる展開の大半はこれで対応できます。MSI しか認めないポリシーには、WiX が適切なツールです。

どの .NET バージョンで使えますか?

発行フォルダーを生成できるものならすべてです。.NET 6、7、8、9 以降に加え、Visual Studio でビルドした .NET Framework アプリ(bin\Release の出力を使います)にも対応します。

関連ガイド