.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:インストーラーをビルドする
- zip を ExeTup にアップロードします。アプリの
.exeがメインプログラムとして選ばれますが、自己完結型の発行にはcreatedump.exeも含まれており、それはメインプログラムではないので、選択を確認してください。 - 名前、バージョン(プロジェクトの
<Version>と揃えておきます)、発行元、ライセンスを入力します。 - Program Files に入れる従来型のデスクトップアプリならすべてのユーザーを、顧客に管理者権限がない可能性があるなら現在のユーザーを選びます。
win-x64の発行なら 64 ビットのままにし、win-x86なら 32 ビットを選びます。- 同じ
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 の出力を使います)にも対応します。
関連ガイド
- Windows アプリの Setup.exe を作る方法(コード不要)Setup.exe が実際に行うこと、作成する3つの方法、そしてインストーラースクリプトを書かずにアプリのフォルダーを数分でプロ品質のインストーラーに変える方法を解説します。
- MSIとEXEインストーラーの違い:Windowsアプリはどちらで配布すべきかMSIパッケージとSetup.exeの本当の違い、IT部門が本当にMSIを必要とするケース、MSIXの位置づけ、そしてほとんどのデスクトップアプリがEXEで配布される理由を解説します。
- 「Windows によって PC が保護されました」:SmartScreen 警告の意味と消し方新しいインストーラーで Windows が「発行元不明」の警告を表示する理由、ユーザーが押せるボタン、そしてコード署名と評価によって警告が消える仕組みを解説します。