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


はじめに

サーバーリプレースでデータベース変更(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"に変更してユーザー設定を書き換えた。

発行バージョン 3.0.2.0、アセンブリバージョン 1.0.0.0
「プログラムと機能」でも以前のバージョンは消えて最新バージョンのみとなっている。

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

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

発行バージョン 3.1.0.0、アセンブリバージョン 1.0.0.0
プラットフォームターゲットをAnyCPUからx86に変更。

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

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

原因

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によるインストール自体がもう古いのかな。