Edited at

ClickOnceでターゲットCPUを変更するとユーザー設定を引き継げない

More than 1 year has passed since last update.


はじめに

サーバーリプレースでデータベース変更(Oracle 11g → PostgreSQL 9.6)になるため、アプリケーションの改修作業をしており、その中でClickOnceを使用したものがありました。

以前、別アプリケーションの改修作業をした際には、下記の方法でユーザー設定(user.config)を引き継げることが出来ました。

ClickOnceでバージョンアップしても消えないデータの残し方


データ引き継ぎ

    if (!Properties.Settings.Default.IsUpgraded)

{
Properties.Settings.Default.Upgrade();
Properties.Settings.Default.IsUpgraded = true;
Properties.Settings.Default.Save();
}
}


調査

今回はユーザー設定(user.config)を引き継げなかった上に「プログラムと機能」には以前のバージョンが残ったままとなる原因を簡単なプログラムを作成して調査しました。

※ClickOnceでは、アセンブリバージョンで設定ファイル(user.cofig)が作成されるので、アセンブリバージョンを変更してしまうと前バージョンの設定を引き継げなくなる。ClickOnceを使う場合は発行バージョンでバージョンを管理する。よって、アセンブリバージョンは1.0.0.0のままにしておく。


プログラム仕様

user.configには、"テスト"が初期値に入っておりテキストボックスに初期表示し、ボタンをクリックすることで値を書き換えることが出来る。


調査開始

発行バージョン 3.0.1.0、アセンブリバージョン 1.0.0.0

"テスト"から"ABC"に変更してユーザー設定を書き換えた。

ClickOnceアプリ.png

発行バージョン 3.0.2.0、アセンブリバージョン 1.0.0.0

「プログラムと機能」でも以前のバージョンは消えて最新バージョンのみとなっている。

ClickOnce重複なし.png

初期表示に引き継いだ値が表示されています。

ClickOnceアプリ.png

ここで一旦、発行バージョン 3.0.2.0 はアンインストール時に以前のバージョン 3.0.1.0 に戻す。

発行バージョン 3.1.0.0、アセンブリバージョン 1.0.0.0

プラットフォームターゲットをAnyCPUからx86に変更。

「プログラムと機能」には以前のバージョンが残ったままとなる。

ClickOnce重複.png

初期表示のまま、引き継いだ値が表示されない。

ClickOnceアプリ3.png


原因

ClickOnceの配布条件にはターゲットCPUも含まれているということになります。

このアプリケーションはmdbファイルの読み込み処理があり、64bit版Windowsには「Microsoft.Jet.OLEDB.4.0」が存在しないため、プラットフォームターゲットをAnyCPUからx86にしました。これ以外にもClickOnceでCrystalReportインストール時のlog4net Version=1.2.10.0エラーなどもあり、64bit対応に苦労した経緯があったのです。


対応

強引にユーザー設定(user.config)を引き継ぐ処理を入れようとしたら、Application Data の内容を読み取りしようとするとアクセス拒否されてしまうのです。

アクセス権限までどうこうするまでやりたくないので、ここは諦めてユーザーさんに設定値を再入力してもらうことにします。

もともとユーザー設定を引き継ぐ処理は入ってなくて、改修のついでに入れようとしたんだよね。次のバージョンからはターゲットCPUが同じになるのでユーザー設定は引き継がれる。


最後に

Windows 7のPCを購入するのも難しくなってきました。そうすると、Windows 10 64bit版のPCを購入することになります(今更32bit版にしないかなと・・・)

その割には、Officeは32bit版をインストールされたりするんだよな。

64bit版の「Microsoft.Jet.OLEDB.4.0」を提供しないから面倒くさいんだよね。

ClickOnceによるインストール自体がもう古いのかな。