3流プログラマのメモ書き

元開発職→社内SE→派遣で営業支援→開発戻り浦島太郎状態の三流プログラマのIT技術メモ書き。 このメモが忘れっぽい自分とググってきた技術者の役に立ってくれれば幸いです。

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

ClickOnceでアプリケーションを配置してるんですが、バグを修正し新バージョンを発行しなおしました。

それでクライアント側のショートカットからアプリケーションを起動しようとすると、更新チェック後にエラーが発生し起動できません。

(ちなみに、アプリケーションのショートカットからでなく、ブラウザから起動すると別物してインストールされてしまいます。何故かアプリケーション名に -1 が付きます)

エラーの詳細を見たところ内容は以下のような感じでした。

エラー

プラットフォームのバージョン情報

Windows : 6.1.7601.65536 (Win32NT)

Common Language Runtime : 4.0.30319.18408

System.Deployment.dll : 4.0.30319.18408 built by: FX451RTMGREL

clr.dll : 4.0.30319.18408 built by: FX451RTMGREL

dfdll.dll : 4.0.30319.18408 built by: FX451RTMGREL

dfshim.dll : 4.0.31106.0 (Main.031106-0000)

ソース

配置の URL: file:///C:/Users/hoge/AppData/Roaming/Microsoft/Windows/Start%20Menu/Programs/testapp/hogehogeapp.appref-ms%7C

サーバー: Microsoft-IIS/6.0

X-Powered-By: ASP.NET

配置プロバイダの URL: http://xxx.xxx.xxx.xxx:/testapp/hogehogeapp.application

エラーの概要

以下はエラーの概要です。これらのエラーの詳細はログに一覧表示されています。

* C:\Users\hoge\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\testapp\hogehogeapp.appref-ms| のライセンス認証により例外が発生しました。 次の失敗メッセージが検出されました:

+ 配置 ID がサブスクリプションと一致しません。

コンポーネント ストア トランザクションの失敗の概要

トランザクション エラーは検出されませんでした。

警告

この操作中に警告は発生しませんでした。

操作の進行状況

* [2014/01/24 16:33:32] : C:\Users\hoge\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\testapp\hogehogeapp.appref-ms| のライセンス認証が開始されました。

* [2014/01/24 16:33:32] : 配置で指定されたように必要な更新チェックを実行しています。

エラーの詳細

この操作中に次のエラーが検出されました。

* [2014/01/24 16:33:32] System.Deployment.Application.DeploymentException (SubscriptionState)

- 配置 ID がサブスクリプションと一致しません。

- ソース: System.Deployment

- スタック トレース:

場所 System.Deployment.Application.SubscriptionStore.CheckUpdateInManifest(SubscriptionState subState, Uri updateCodebaseUri, AssemblyManifest deployment, Version currentVersion, Boolean& bUpdateInPKTGroup)

場所 System.Deployment.Application.ApplicationActivator.PerformDeploymentUpdate(SubscriptionState& subState, String& errorPageUrl)

場所 System.Deployment.Application.ApplicationActivator.ProcessOrFollowShortcut(String shortcutFile, String& errorPageUrl, TempFile& deployFile)

場所 System.Deployment.Application.ApplicationActivator.PerformDeploymentActivation(Uri activationUri, Boolean isShortcut, String textualSubId, String deploymentProviderUrlFromExtension, BrowserSettings browserSettings, String& errorPageUrl)

場所 System.Deployment.Application.ApplicationActivator.ActivateDeploymentWorker(Object state)

コンポーネント ストア トランザクションの詳細

トランザクション情報はありません。

エラーは「ライセンス認証により例外が発生しました」となり、原因が「配置 ID がサブスクリプションと一致しません。」となっています。

ClickOnce用にしている証明書が変更されたりすると、別アプリと認識され、このようなエラーが出ることは知っていましたが、今回は証明書は変更してません。

いろいろ調べてみるとMSDN:.NET Framework 2.0 ベースのアプリケーションでClickOnce の証明書を変更すると別のアプリケーションとして認識されるに気になる記述が。。。

.NET Framework 2.0 は以下の 4 つの項目を基に ClickOnce アプリケーションの一意性を識別します。.NET Framework は 各項目の 1 つでも異なる場合には別アプリケーションとして識別し、新規インストールを実施します。

アプリケーション名

公開キー トーク

カルチャ

プロセッサアーキテクチャ (x86 など)

(.NET Framework 2.0 SP1 が当たっていると、アプリケーション名、カルチャ、プロセッサアーキテクチャの項目でアプリケーションを識別するようです。)

ここでピンと来たのがプロセッサアーキテクチャです。

そういえば、ビルドがうまくいかくて、VisutalStudio でプロセッサアーキテクチャを "x86" から "ANY CPU" に変えてました。

この問題のアプリケーションのクライアント側のClickOnceのショートカットをテキストエディタで見てみると、以下のようになっていました。

http://xxx.xxx.xxx.xxx:/testapp/hogehogeapp.application, Culture=neutral, PublicKeyToken=4fdc3b94a306e3c2, processorArchitecture=x86

確かにまともに動いていた時はプロセッサアーキテクチャx86だったようです。

VS側で "ANY CPU" を "x86" に戻してビルドしなおし発行したところ、今度はエラーが出ず最新版に置き換わりました。

まったくヤレヤレです。

ClickOnceは確かに手軽にクライアントへの展開ができるから便利なんですが、アップデート絡みになるといろいろかゆいところに手が届かず困ります。

そもそも証明書なしでも展開できるような仕組みにして欲しかったです。(例えばクライアントが自身とClickOnce発行サーバのIP確認して同じサブネットなら証明書なしでも起動できるとか。。。)