Visual Studio 2026 (Preview) 環境にて、.NET 10 (Windows Forms) のアプリケーションを ClickOnce で発行しようとした際、GUI 上では成功しているように見えるものの、実際にはインストーラー(setup.exe)が作成されないという現象に遭遇しました。
その原因と、コマンドラインを使った解決策をまとめます。
1. 起きた不具合
Visual Studio の「発行」ウィザードから ClickOnce の発行を行いました。
ビルドログには「正常に終了しました」と表示される、あるいはパスが見つからない旨のエラーが表示されるものの、指定した発行先フォルダ(app.publish)を確認すると、以下のいずれかの状態になっていました。
- フォルダ自体が存在しない
- フォルダは作成されたが中身が空
- bin\publish という別のフォルダに、実行ファイルだけが出力され、setup.exe やマニフェストファイルが存在しない
何度プロファイルを作り直しても、Visual Studio の画面から実行する限り解決しませんでした。
2. 原因
調査の結果、「Visual Studio の発行機能が、不適切なビルドコマンドを使用している」 ことが原因だと判明しました。
- 現状の構成: .NET 10 (最新の .NET)
- 使用したい機能: ClickOnce (従来の .NET Framework 時代から続くインストーラー作成技術)
ClickOnce のインストーラー(setup.exe)を作成するには、GenerateBootstrapper というタスクを実行する必要があります。しかし、このタスクは従来の完全版ビルドツールである msbuild.exe には含まれていますが、軽量版のクロスプラットフォームツールである dotnet コマンド には含まれていません。
Visual Studio (Preview) が、.NET 10 のプロジェクトであるためか、誤って dotnet コマンド(またはそれに準ずるCore版ビルド)で発行処理を行おうとし、結果として setup.exe の生成処理がスキップ(または失敗)されていました。
実際に dotnet コマンドで強制的に発行を試みると、以下のようなエラーが出力され、機能がサポートされていないことがわかります。
error MSB4803: タスク "GenerateBootstrapper" は .NET Core バージョンの MSBuild ではサポートされていません。.NET Framework バージョンの MSBuild をご使用ください。
3. 対処
Visual Studio の GUI ボタンを使わず、ターミナルから直接 msbuild コマンド を叩くことで解決しました。
dotnet を付けずに実行するのがポイントです。
手順:
- Visual Studio の「ターミナル」または PowerShell を開く。
- プロジェクトファイルのがあるディレクトリへ移動する。
- 以下のコマンドを実行する。
※ PublishProfile=xxxxx の部分は、ご自身の作成した発行プロファイル名(.pubxml のファイル名から拡張子を除いたもの)に書き換えてください。
# 正解: dotnet を付けずに msbuild を直接呼ぶ
msbuild /t:Publish /p:Configuration=Release /p:PublishProfile=ClickOnceProfile
これにより、本来の出力先である bin\Release\net10.0-windows\app.publish\ フォルダ内に、無事 setup.exe と Application Files が生成されました。
4. 今後
これは Visual Studio (Preview) 版特有の挙動、あるいは過渡期のバグである可能性が高いです。将来的には修正され、GUI の「発行」ボタンから正しく msbuild が呼び出されるようになると思われます。
それまでの間は、毎回コマンドを打つのも手間なので、プロジェクトフォルダに発行用のバッチファイル(.bat)を作成しておくことにしました。
publish.bat の例
@echo off
echo ClickOnce発行を開始します...
REM プロファイル名は実際の環境に合わせて変更してください
msbuild /t:Publish /p:Configuration=Release /p:PublishProfile=ClickOnceProfile
pause
今後はこのバッチファイルをダブルクリックするだけで、確実にインストーラーを作成できます。同じ現象に悩んでいる方は、GUI に頼らずコマンドラインからの発行を試してみてください。

0 件のコメント:
コメントを投稿