トップ回答者
Clickonceを利用してもapp.configを上書きしたくない

質問
-
お世話になります。
Clickonceを利用してアプリケーションの配布・自動更新を考えております。
アプリケーション中で、ユーザ個別の情報をapp.configに保持するようにしております。
初回インストール時は問題ないですが、2回目以降のインストール時(更新)に
app.configも当然上書きされてしまいます。
これでは、せっかく設定した個別の設定情報がまた初期化されてしまいます。
2回目以降のセットアップ時には、app.configをインストールしないようにするにはどのようにしたら良いのでしょうか?
分かる方居ましたらどうか教えてください。
回答
-
プロファイルに保存するのが一番だと思います。Visual Studio を使用されているならば、app.config の該当の項目のスコープをアプリケーションからユーザーに変更するだけです。スコープがユーザの項目は、app.config に初期値のみが保存され、現在値はプロファイルに保存されるので、バージョンアップ後によって内容が失われなくて済みます。
他にも、app.config に保存しないで ClickOnce のデータディレクトリに書き込むという手もあります。データディレクトリはバージョンアップ時に引き継がれますし、app.config 同様にバージョンの差異を吸収するためのアップグレードのイベントも ClickOnce から提供されます。
-
ClickOnce では、インストール毎に ID が割り振られ、新しいフォルダが Apps\2.0\{ID} と Apps\2.0\Data\{ID} に作られます。
※ 実際は ClickOnce の配布設定などによって作られるフォルダ構成が色々とありますので大雑把に。あるアプリケーションのバージョン 3 が {ID3} としてインストール済みの状態で、バージョン 4 が発行されて {ID4} としてダウンロードされた場合、Apps\2.0\{ID4}\ はすべて新しいバージョンのファイルになりますが、Apps\2.0\Data\{ID4}\ は、Apps\2.0\Data\{ID3} を引き継いで作成されます。スコープがユーザーになっている app.config の設定は、Apps\2.0\{ID3}\(構成)\user.config に保存されますので、バージョンアップ後は Apps\2.0\{ID4}\(構成)\user.config として引き継がれ、バージョン 4 の上から読み出せるようになっているはずです。
- 回答としてマーク sumi_sumi 2010年12月9日 10:13
-
(Express Edition だと微妙に違うかもしれませんが、)ソリューションエクスプローラーから Properties をダブルクリックするか、プロジェクトのプロパティから、設定タブを開くと、プロジェクトのアプリケーション設定デザイナが表示されて、app.config の項目が編集できませんか?
app.config の設定項目が一覧で表示されるので、「スコープ」の部分を「アプリケーション」から「ユーザー」に変更すると、自動的に ClickOnce のデータディレクトリに保存されるようになります。スコープが「アプリケーション」になっているものは、発行毎に必ず上書きされ、「ユーザー」になっているものは、新規インストール時の初期値という扱いになり、アップグレード時には前回の設定値が継続されます。
- 回答としてマーク sumi_sumi 2010年12月9日 10:13
すべての返信
-
プロファイルに保存するのが一番だと思います。Visual Studio を使用されているならば、app.config の該当の項目のスコープをアプリケーションからユーザーに変更するだけです。スコープがユーザの項目は、app.config に初期値のみが保存され、現在値はプロファイルに保存されるので、バージョンアップ後によって内容が失われなくて済みます。
他にも、app.config に保存しないで ClickOnce のデータディレクトリに書き込むという手もあります。データディレクトリはバージョンアップ時に引き継がれますし、app.config 同様にバージョンの差異を吸収するためのアップグレードのイベントも ClickOnce から提供されます。
-
(Express Edition だと微妙に違うかもしれませんが、)ソリューションエクスプローラーから Properties をダブルクリックするか、プロジェクトのプロパティから、設定タブを開くと、プロジェクトのアプリケーション設定デザイナが表示されて、app.config の項目が編集できませんか?
app.config の設定項目が一覧で表示されるので、「スコープ」の部分を「アプリケーション」から「ユーザー」に変更すると、自動的に ClickOnce のデータディレクトリに保存されるようになります。スコープが「アプリケーション」になっているものは、発行毎に必ず上書きされ、「ユーザー」になっているものは、新規インストール時の初期値という扱いになり、アップグレード時には前回の設定値が継続されます。
- 回答としてマーク sumi_sumi 2010年12月9日 10:13
-
K.Takaokaさま
有難う御座います。
ちょうどその通りに設定して動作確認しておるところでした。
結果から申しますとまだ現状解決しておりません。
2回目以降のClickOnceのインストールでアプリケーション、ならびにconfigファイルも最初の場所とは違う別のフォルダにインストールされてしまいます。
インストールしたアプリケーションを起動すると、その新しいフォルダのconfigファイルが読まれています。
ちなみに以下のパスにインストール度にフォルダが新しく作成されます。
C:\Documents and Settings\USER\Local Settings\Apps\2.0\EYEVW05C.7VH\E0QAGVQ1.6Q0
configファイルの保存場所を固定にすれば良いのでしょうか?
何か勘違いしていましたらどうかご指摘ください。
PS VSは、Standard Editionを使っております。
-
ClickOnce では、インストール毎に ID が割り振られ、新しいフォルダが Apps\2.0\{ID} と Apps\2.0\Data\{ID} に作られます。
※ 実際は ClickOnce の配布設定などによって作られるフォルダ構成が色々とありますので大雑把に。あるアプリケーションのバージョン 3 が {ID3} としてインストール済みの状態で、バージョン 4 が発行されて {ID4} としてダウンロードされた場合、Apps\2.0\{ID4}\ はすべて新しいバージョンのファイルになりますが、Apps\2.0\Data\{ID4}\ は、Apps\2.0\Data\{ID3} を引き継いで作成されます。スコープがユーザーになっている app.config の設定は、Apps\2.0\{ID3}\(構成)\user.config に保存されますので、バージョンアップ後は Apps\2.0\{ID4}\(構成)\user.config として引き継がれ、バージョン 4 の上から読み出せるようになっているはずです。
- 回答としてマーク sumi_sumi 2010年12月9日 10:13
-
K. Takaokaさま
有難う御座います。
せっかく教えていただいているのに現状変わらずです。
申し訳ないです。
関係あるのか分かりませんが、ちょっと気になる点が2つありました。
1.設定タブにより、app.configが出来上がるとVisual Studioのエラー一覧画面に即座に6つのメッセージが表示されます(エラーや警告でないのですが)。
これは関係ないのでしょうか?エラーではないのでコンパイル出来ていますが・・・。
以下のようなメッセージです。
メッセージ 1 要素 'userSettings' のスキーマ情報が見つかりませんでした。
メッセージ 2 要素 'Setup.Properties.Settings' のスキーマ情報が見つかりませんでした。
メッセージ 3 要素 'setting' のスキーマ情報が見つかりませんでした。
メッセージ 4 属性 'name' のスキーマ情報が見つかりませんでした。
メッセージ 5 属性 'serializeAs' のスキーマ情報が見つかりませんでした。
メッセージ 6 要素 'value' のスキーマ情報が見つかりませんでした。以下が出来たapp.configです。
<?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" > <section name="Setup.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" /> </sectionGroup> </configSections> <appSettings> </appSettings> <userSettings> <Setup.Properties.Settings> <setting name="hoge" serializeAs="String"> <value>冬は寒い</value> </setting> </Setup.Properties.Settings> </userSettings> </configuration>
2.教えていただいたインストール毎のフォルダ構成を確認したのですが、
Apps\2.0\Data\{ID}側には、IDのようなフォルダこそ作られているのですがconfigやexeやらのファイル類は一切作られておらず空です。
これは、動きとして何かおかしいのでしょうか?
-
すいません、もう帰宅するので前者はすぐに確認できませんが、後者については、発行の設定でデータファイルであるとマーキングしているファイルが0個で、ClickOnce の Data ディレクトリに対して何も書きこんでいない場合には、空っぽの状態が正常です。
上の例だと、Settings.Default["hoge"] を書き換えた後で、Settings.Default.Save() を呼び出されていますか? Save() を呼び出した時点で Data ディレクトリに user.config というファイルが作成されると思います。(そして、それがバージョンアップ後も引き継がれます)