ClickOnce で同一プロジェクトから複数発行されたプログラムを同一環境にインストールできるように設定する (.NET Framework 版限定)

Siden oppdatert :
ページ作成日 :

動作確認環境

Visual Studio
  • Visual Studio 2022
.NET Framework
  • .NET Framework 4.8

動作必須環境

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

はじめに

この Tips では同一プロジェクトから複数発行した ClickOnce を同一環境に別々にインストールする方法について説明します。

同一プロジェクトから別々の構成で複数発行する手順について

例えば同じプロジェクトでもビルド構成によって処理内容を変えている場合に別々のプログラムとして発行したい場合があると思います。 これは .NET (Core) 版では可能ですが .NET Framework 版では Visual Studio の標準機能ではできません。

この方法についてはバッチプログラムを使用した方法で以下の Tips にまとめています。 本 Tips では以下の内容ができていることを前提に説明しています。

ClickOnce で別々のアプリケーションとしてインストールされる条件

先述のバッチプログラムを使用する方法で発行した場合ビルド構成は変えていますがどちらも同じアプリケーションとして扱われるため、 同一環境に2つインストールしようとすると競合してしまい後からインストールしようとしたものがインストールに失敗してしまいます。

これを別のアプリケーションとして認識させる必要があるのですが、参照先の記事によると以下のパラメータによってアプリケーションが識別されるようです。

参考 : (.NET)ClickOnceで発行後にアプリを起動すると「配置IDがサブスクリプションと一致しません」と怒られる

  • アプリケーション名
  • 公開キー トークン
  • カルチャ
  • プロセッサアーキテクチャ (x86 など)

この中で「カルチャ」と「プロセッサアーキテクチャ」は意図しない処理結果になる可能性があるので変えるのは好ましくないと思います。

「アプリケーション名」を変える方法は一応ありかとは思いますが、 基本的にはひとつのプロジェクトで名前はひとつしか付けられないのであまりお勧めではありません。 一応プロジェクトファイルの中身でビルド構成と条件パラメータによって複数定義できる可能性はありますが、 Visual Studio の UI としてはひとつしか設定できないので操作によっては上書きされてしまう可能性があるので少し危険です。

残りは「公開キー トークン」ですがこちらは証明書を複数作成することができますし、 ClickOnce 発行時のパラメータとして指定できるので今回はこれでアプリケーションの識別化をしたいと思います。

動作確認手順

プロジェクトを作成するところからバッチファイルで発行できる状態になるところまでは以下の Tips と同じなので、そこまでの手順はそちらを参考にしてください。

証明書の作成

今回はサンプル向けにテスト用の証明書で確認をします。 本来は正規の証明書で行うべきですが証明書の作成や認証局の準備など本題とは別の手順が必要になってしまいますので証明書関連の説明は除外します。 本番運用ではテスト証明書のファイルを本番用のファイルに置き換えればOKです。

プロジェクトを作成し発行用のバッチまで作成したら Visual Studio に戻ります。 プロジェクトのプロパティを開き左のメニューから「署名」を選択します。 「ClickOnce マニフェストに署名する」のチェックがあるのでチェックします。

ここで証明書を2つ作成します。今回はこの画面で作成しますが「.pfx」ファイル形式の証明書なら他の手段で作っても問題ありません。

右下に「テスト証明書の作成」ボタンがあるのでクリックします。

パスワードを入れることもできますが入れても入れなくても動きます。 ただパスワードを入れる場合は手順が面倒になるので今回は入れません。

プロジェクトに証明書(.pfx)ファイルが生成されました。ここで生成されるファイル名は固定ですが後で変えることもできます。 ちなみにここで作成したテスト証明書の有効期限は1年です。1年過ぎたら新しく証明書を作り直す必要があります。

同じ手順でもう一つ作成してください。

今回は Debug ビルドと Release ビルドで発行するので分かりやすい名前に直しておきます。

バッチの修正

作成してあるバッチファイル(.bat) をテキストエディタで開き msbuild のパラメータに以下のものを追加します。

パラメータ名 説明 必須
ManifestKeyFile 証明書のファイル名(.pfx) です。プロジェクトファイルからの相対パスか絶対パスを指定します。
ManifestCertificateThumbprint マニフェスト証明書の拇印です。入れる値はなんでもいいですが必ず入れる必要があります。
ProductName 製品名。スタートメニューやプログラムの一覧の表示名になる。
PublisherName 公開社名。スタートメニューでプログラムをまとめる際のフォルダ名になる。

上記を踏まえてパッチファイルを以下のように修正します。

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\\" /p:ManifestKeyFile="ClickOnceMultipleInstallDebug.pfx" /p:ManifestCertificateThumbprint="Debug" /p:ProductName="CliclOnce テスト Debug システム" /p:PublisherName="Sorceryforce"

ClickOnceRelease発行.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=Release /p:PublishUrl="publish\Release\\" /p:InstallUrl="\\xxxxServer\publish_Release\\" /p:ManifestKeyFile="ClickOnceMultipleInstallRelease.pfx" /p:ManifestCertificateThumbprint="Release" /p:ProductName="CliclOnce テスト Release システム" /p:PublisherName="Sorceryforce"

ManifestKeyFile の値はそれぞれ別の証明書ファイルを指定します。ManifestCertificateThumbprint の値は何でもいいですがこれを入れないとアプリケーションが別のものとして識別できないので必ず入れてください。

ちなみに今回は2つのプログラムを同じ環境にインストールするので見分けがつくように ProductName パラメータも追加しています。PublisherName はお好みで。

発行

入力が終わったらそれぞれのバッチファイルを実行して発行します。

発行したファイルに xxxx.application があるのでテキストエディタで開き、publicKeyToken の値がそれぞれ別の値になっていることを確認します。

インストール

発行したファイルを公開用フォルダにコピーしたら setup.exe を実行してインストールします。

発行時に証明書を入れるとインストール時に以下の画面が表示されます。テスト証明書だと公開元は確認できないのでそのままインストールします。

一つ目のプログラムがインストールされ起動できました。

もうひとつの方もインストールしてみます。

もうひとつの方もインストールされ起動できました。

もちろん両方同時に動いています。

ProductName をつけたのでスタートメニューでも別々に表示されています。

アプリの一覧にも両方表示されています。