web-dev-qa-db-ja.com

app.configでアプリケーション設定が読み取り専用になるのはなぜですか?

App.configに「グローバル」にするつもりの設定があります。すべてのユーザーがそれらを変更でき、すべてのユーザーが同じ設定を取得します。

しかし、ユーザー設定に変更しない限り、それらは読み取り専用です。

どうしてこれなの?

また、アプリのグローバル設定を維持するにはどうすればよいですか?

編集:

これは実際には、LocalSystemとしてサービスとして実行されるWindowsサービスアプリケーションです。引数「/ config」を使用してローカル管理者が手動で実行することもできます。これにより、構成値を編集するためのWindowsフォームが起動します。

したがって、両方の状況で%PROGRAMFILES%への書き込みアクセス権があります。

したがって、私の設定にアクセスする方法は次のとおりです。

Settings.Default.MySetting = MyNewValue;

また、MySettingがApplication(プロジェクトプロパティのSettings.settingsで)に設定されていると、「MySetting is read only」というコンパイル時エラーが発生します。

私はこれに慣れていないので、どのように行われるべきかについての非常に良い説明をまだ見つけていません。たとえば、「デフォルト」と言う必要があるのはなぜですか。それは実際にはどういう意味ですか。何も思いつきません。誰かが私にapp.configの使用法のチュートリアルを教えてくれるなら、それは本当に役に立ちます。

25
Blorgbeard

本当の完全な答え:

App.config設定は、2種類の設定があるため、読み取り専用です。

  1. アプリケーションの設定
  2. ユーザー設定

最初のものは、アプリケーション発行者が新しいバージョンを発行しない限り変更されません。 2番目はapp.configではなく、user.configファイルに格納されます。このuser.configファイルがない場合、app.configはデフォルト値を提供します。

MySettingがユーザー設定の場合:

Settings.Default.MySetting = MyNewValue;
Settings.Default.Save();

新しい設定でuser.config[User Local Settings Application Data]\[company name]\[application].exe[hash string]\[version]ファイルを作成し、それらの設定がapp.configファイルの設定より優先されます。

62
Jader Dias

理由:アプリケーション設定は、ユーザーが書き込み権限を持たないProgram Filesの下のApplicationフォルダーに保存されることを目的としています。

方法:「すべてのユーザー」のデフォルトのサポートはありませんが、パブリックフォルダーに独自のカスタム構成ファイルをセットアップするか、データベースを使用できます。

4
Henk Holterman

簡単に言えば、あなたがそうする特権を与えない限り、誰もが変更できるマシン上の場所はありません。

このような状況に対処するには、いくつかの方法があります。

  • 構成ファイル/一部のレジストリ設定を作成し、これを「すべてのユーザー」プロファイルに入れて、「すべてのユーザー」にその特定のファイルを変更する権限を付与できます。インストール中に、適切な権限を付与する手順を自動化でき、プログラムは残りを処理できます。

  • UACを利用して、現在のユーザーがシステム全体の設定を変更するための適切な特権を持っていることを確認できます。これは推奨されるアプローチですが、誰もが特定の設定を変更できるわけではないことも意味します。

  • 共有データベースを使用して、そこに設定を保存できます。

  • ???

プログラムファイルディレクトリの項目を変更したり、デフォルトの権限をそこから変更したりすることはお勧めしません。

編集:ローカルシステムとして、実際にプログラムファイルディレクトリへの書き込み権限があります。 「読み取り専用」エラーが発生した場合は、設定自体が読み取り専用であることを意味します。構成ファイルの設定を変更できるようにするには、構成マネージャーを使用する必要があります。

お役に立てれば。

3
Jeroen Landheer

ここの意味がよくわかりません。ユーザーがUIからapp.configを変更することを許可し、変更が保持されないことを意味しますか?

呼びましたか

ConfigurationManager.RefreshSection("appSettings");

そして

Configuration.Save();
1
oscarkuo

1つの理由は、app.configファイルがProgram Filesディレクトリの下のアプリのフォルダーにあり、Program Files内のすべてがデフォルトで標準ユーザーに対してのみ読み取られることです。

もう1つは、app.config設定がシステム全体に適用されることです。 1人のユーザーが変更を行うと、他のユーザーに影響を与えます。通常のユーザーは、そのような変更を行うことができないはずです。複数のユーザーに影響を与える可能性があるものは、システム管理者のみが設定する必要があります。ユーザーごとの設定は、各ユーザーのApplication Dataフォルダーに属しています。

0
Joel Coehoorn

アプリケーションを起動すると、構成設定がメモリにキャッシュされます。 app.configファイルをxmlとして処理して値を変更できます。

0
Khaled Musaied