選択しているビルド構成によって ClickOnce の設定を変える (.NET Framework 版限定)

ページ更新日 :
ページ作成日 :

環境

フレームワーク
  • Windows Forms (.NET Framework) 全般
  • WPF (.NET Framework) 全般

前提

この Tips の内容は .NET Framework のプロジェクト前提です。 .NET (Core) の場合はビルド構成単位で ClickOnce の発行設定ができるので通常通りに発行してください。

また、ClickOnce を普通に使える程度の知識があること前提としています。

はじめに

.NET Framework のプロジェクトでは ClickOnce の発行設定を1つしか持てないため、 例えば Debug ビルドと Release ビルドで異なる設定で発行するには毎回手入力で設定を変えてから発行する必要があります。

プロジェクトを DLL にまとめ、発行用のプロジェクトを別に2つ作れば設定を2つ持たせることはできますが、 同じような設定を2重に持つことになりますし、発行に必要なリソースファイルがある場合はそれらも2つずつ持たないといけないので管理が面倒になります。

ここではバッチファイル (.bat) を必要な設定の数だけ作成し ClickOnce を発行する方法について説明します。

ClickOnce の設定

今回は「公開フォルダーの場所」と「インストール フォルダーの URL」を「Debug ビルド」と「Release ビルド」で別々にし、 他の設定は共通にする方針で作成します。 他のパラメータも別々にすることは可能ですが「アプリケーション ファイル」や「必須コンポーネント」を別々にする場合は面倒かもしれません。

まずはプロジェクトを開き、通常通り ClickOnce の設定を入力します。 入力内容は Debug で発行するパラメータにしていますが、共通部分以外はエラーにならなければなんでも問題りません。

以下は設定の一例です。

入力したらプロジェクトを保存します。

ClickOnce 発行用の .bat ファイルを作成

コマンドで発行するので PowerShell などの他の媒体でも実行可能ですが、今回は BAT ファイルで作成します。

ファイルはどこに作成しても問題ありませんが、今回は記述の簡略化のためにソリューションファイル (.sln) のある場所に作成します。 BAT ファイルなので文字コードは Shift-JIS にしています。PS1 であれば UTF-8 (BOM) でも構いません。

BAT ファイルをテキストエディタで開き、以下のように入力します (一例です)。PowerShell の場合はエスケープ処理が異なる場合がありますので注意してください。

call "C:\Program Files\Microsoft Visual Studio\2022\Community\Common7\Tools\VsDevCmd.bat"
cd %~dp0
msbuild ClickOnceBuildConfiguration.sln /t:Publish /p:Configuration=Debug /p:PublishUrl="publish\Debug\\" /p:InstallUrl="\\xxxxServer\publish_Debug\\"

1行目は「開発者コマンドプロンプト」の場所を指します。このパスはインストールしている Visual Studio のバージョンによって異なります。

パスの各箇所は以下の条件によって変わります。

Program Files
パス 条件
Program Files
  • 32bit OS を使用している場合
  • 64bit OS で 64bit 版の Visual Studio を使用している場合
Program Files (x86)
  • 64bit OS で 32bit 版の Visual Studio を使用している場合
2022
インストールしている Visual Studio のバージョンによって変わります。
Community
インストールしている Visual Studio のエディションによって変わります。「Community」「Professional」「Enterprise」などが入ります。

2行目はカレントディレクトリを BAT ファイルのある場所に移動しています。

3行目は ClickOnce のビルド処理コマンドです。各パラメータの意味は以下のようになっています。

パラメータ名 説明
msbuild ビルド処理を実行するコマンドです。必須で一番最初に記述します。
ClickOnceBuildConfiguration.sln ビルド対象のソリューションファイル名を記述します。
/t:Publish ClickOnce ビルド処理であることを示します。
/p:Configuration=Debug ソリューションに設定してあるビルド構成を指定します。ビルドするデバッグ構成を変える場合は「Debug」部分のテキストを変更します。
/p:PublishUrl="publish\Debug\\" Visual Studio の発行画面にある「公開フォルダ―の場所」の値を指定した文字列で上書きして実行します。
/p:InstallUrl="\\xxxxServer\publish_Debug\\" Visual Studio の発行画面にある「インストール フォルダーの URL」の値を指定した文字列で上書きして実行します。

パラメータを一部抜粋しましたが、他のパラメータについては以下のリンク先ページを参照してください。

今回サンプルとして Debug と Release のビルドそれぞれで ClickOnce の発行パラメータを変えるので以下のように作成します。

ClickOnceDebug発行.bat

call "C:\Program Files\Microsoft Visual Studio\2022\Community\Common7\Tools\VsDevCmd.bat"
cd %~dp0
msbuild ClickOnceBuildConfiguration.sln /t:Publish /p:Configuration=Debug /p:PublishUrl="publish\Debug\\" /p:InstallUrl="\\xxxxServer\publish_Debug\\"

ClickOnceRelease発行.bat

call "C:\Program Files\Microsoft Visual Studio\2022\Community\Common7\Tools\VsDevCmd.bat"
cd %~dp0
msbuild ClickOnceBuildConfiguration.sln /t:Publish /p:Configuration=Release /p:PublishUrl="publish\Release\\" /p:InstallUrl="\\xxxxServer\publish_Release\\"

ClickOnce 発行 BAT ファイル実行

それぞれの BAT ファイルを実行してみます。

コマンドプロンプトが起動されビルドが開始されます。

実は今回作成した BAT ファイルはあくまでもビルドまでの処理なので「公開フォルダ―の場所」にはファイルは作成されません。 一応公開に必要なファイルは作成されています。 例えば Debug ビルドなら「<プロジェクトフォルダパス>\bin\Debug\app.publish\」にファイルができているはずです。 これらのファイルを「インストール フォルダーの URL」にコピーすれば正しく ClickOnce として動作します。

公開フォルダーの場所に発行 (発行先が直接アクセス可能なフォルダの場合)

この部分については以下のサイトを参考にしています。

この辺りは ClickOnce の処理とは直接関係ないので細かい説明については上記サイトを参考にしてください。

まずはプロジェクトファイル (.csproj) をテキストエディタで開きます。ソリューションファイルではありません。

中身は XML の構造となっており、一番下にスクロールすると </Project> があるのでその上の行に以下のコードを追加してください。 ファイルコピー前提の処理であれば中身は固定ですが CopyPublishedApplication の部分は任意です。この名前は後で使います。

<!-- ここから ClickOnce の発行処理 -->
<Target Name="CopyPublishedApplication">
  <ItemGroup>
    <MySourceFiles Include="$(PublishDir)**\*.*" Exclude="$(PublishDir)$(AssemblyName).exe" />
  </ItemGroup>
  <PropertyGroup>
    <AppricationDir>$(_DeploymentApplicationDir.Substring($(PublishDir.Length)))</AppricationDir>
  </PropertyGroup>
  <Copy SourceFiles="@(MySourceFiles)" DestinationFiles="@(MySourceFiles->'$(PublishUrl)%(RecursiveDir)%(Filename)%(Extension)')" />
</Target>
<!-- ここまで ClickOnce の発行処理 -->

入力したら保存します。

次に各 BAT ファイルを開いて msbuild のパラメータに /t:CopyPublishedApplication を追加します。CopyPublishedApplication は先ほど付けた名前です。

ClickOnceDebug発行.bat (例)

call "C:\Program Files\Microsoft Visual Studio\2022\Community\Common7\Tools\VsDevCmd.bat"
cd %~dp0
msbuild ClickOnceBuildConfiguration.sln /t:Publish /t:CopyPublishedApplication /p:Configuration=Debug /p:PublishUrl="publish\Debug\\" /p:InstallUrl="\\xxxxServer\publish_Debug\\"

BAT ファイルを実行すると「公開フォルダ―の場所」にファイルがコピーされることを確認できます。この時 <プログラム名>.exe ファイルがありませんがもともと setup.exe に含まれているので不要です。

補足

ソリューションに複数のプロジェクトがある場合、全てのプロジェクトに対して CopyPublishedApplication が実行されます。 ほとんどの場合は exe のプロジェクトにしか設定しないので他のプロジェクトで CopyPublishedApplication が実行された際にエラーが表示されますが、 メッセージが表示されるだけなので無視しても問題ありません。

公開フォルダ―の場所に発行 (FTP の場合)

試してはいませんが、以下のサイトを参考にするとよいでしょう。

そのほか注意点