人気ブログランキング | 話題のタグを見る
(.Net)アプリケーションの設定ファイルを作ろうとしたけど。。。
Windowsアプリケーションの設定先としては ini ファイル、そしてレジストリへと遷移してきました。
.Net では XML ベースのアプリケーション構成ファイル(アプリケーション名.config)と user.config が設定先として推奨されてるようです。

しかし、このアプリケーション構成ファイル、user.config がなかなか曲者でハマりました。(VistaのUACも少し絡んでます。)


まず、アプリケーション構成ファイル(アプリケーション名.config)はWindowsユーザにかかわりなくアプリケーション全体の設定を保存するファイルとなります。

DBの接続文字列など、スコープがアプリケーションになっているものがアプリケーション構成ファイルに保存されます。(Visual Studioのデザイナでは接続文字列のスコープは変更できません。しかし、(VB.Net)DBへの接続文字列を動的に変更させる方法で無理やり変更する方法書いてます)

このスコープをユーザーにすると、ユーザ毎の設定ファイルを .Net が勝手に作ってくれます。このときの保存場所は下記のようになります。

XP: C:\Documents and Settings\ユーザ名\Local Settings\Application Data\<CompanyName>\<ProductName>\<ProductVersion>\user.config
Vista : C:\Users\ユーザ名\AppData\Local\<CompanyName>\<ProductName>\<ProductVersion>\user.config

厄介なのは、スコープがユーザーの設定項目はプログラム側から読み書きできるのですが、スコープがアプリケーションのものは、プログラム側から書き込みができないのです。
(スコープをユーザにすると、 user.config に設定値を保存できるのですが、上記のパスを見てわかるようにアプリケーションのバージョンによってファイルは別になっています。なので、バージョンアップしたときは、前バージョンの設定を引き継ぐ等の処理がいりますね。)

この書き込みができないというのは、アプリケーション構成ファイルに保存ができないという意味です。設定項目のプロパティ(C#なら Properties.Settings.Default.項目など)はReadOnlyになってますが、このプロパティにデータを代入する場合は方法があります。ただしファイルには落とせません。その方法は(.Net)スコープがアプリケーションになっているapp.configの設定プロパティに値を入れる方法を参照。

ということは、ユーザをまたいだ設定は、アプリケーション構成ファイルではできないことになります。
これは正直かなり不便です。


すべてのユーザで共通の設定は一体どこに置けというのでしょうか? 一世代前のようにレジストリを使えということなのでしょうか?
しかし、レジストリを使うと、XCopy 配置を前提にしてる小さなアプリケーションはインストーラを作ってアンインストール時にレジストリを消すようにしないといけませんし、XCopy 配置だけで手軽に使えるという .Net のメリットも意味がなくなってしまいます。

ということは、二世代前の ini ファイル方式で、exeと同じディレクトリにおいてやるのがいいのでしょうか?
一応 WinAPI で ini ファイルの読み書きがサポートされてますが、これもいつまでサポートされるかわからないので不安です。
さらに、厄介なのは Vista で UAC がオンのとき Program Files 配下にアプリケーションを配置した場合です。
UAC がオンだと Program Files 配下はアプリケーションから触ることができません。一応互換性確保のためにユーザ毎に VirtualStore という領域にアプリケーションが変更したファイルが残るらしいですが。。


こちらによると、CommonApplicationData フォルダ(Vistaでは「C:/ProgramData」、XPでは「C:\Documents and Settings\All Users\Application Data」)に設定ファイルを置くという案を提示してましすが、この場合レジストリと同じくインストーラを作らないとアンインストール時にゴミが残っちゃいます。


いろいろ悩みましたが、スコープをユーザにして user.config に書き込むという一番手軽な方法を使うことにしました。(CommonApplicationDataにゴミを残すのは覚悟で)
今、作成中のアプリは実は、アプリケーション共通でも、ユーザ個別でも支障はないので。。

しかし、今後ユーザ関係無しに設定を保存したい場合は、やはりレジストリに書き込むか、VirtualStore覚悟(ProgramFiles配置時)でiniファイルもしくは、自作xmlファイルにするくらいですかね。
by jehoshaphat | 2009-04-01 23:06 | .Net開発


<< (.Net)スコープがアプリケ... レンタルサーバ アイルでのMy... >>