95

重複の可能性:
app.configファイルとXYZ.settingsファイルの違いは何ですか?

デスクトップアプリケーションの設定を保存および管理するためのVisualStudioのこれら2つのメカニズムの明らかな冗長性に、私はかなり混乱しています。

  • XMLapp.configファイルを使用して、セクションに項目を追加できます<appSettings>ConfigurationManagerこれらは、クラスを使用してコードから取得できます。
  • または、Settings.settingsファイルを使用して、エディターを介して個々の設定を追加することもできます。Visual StudioはSettings、実行時に設定をタイプセーフに取得するためのクラスを生成します。

これらの2つのメカニズムは、同じ(またはほぼ同じ)目的を果たしているようです。いくつかの違いがあることは承知していますが、重複とその結果にも戸惑っています。たとえば、Visual Studioを使用してSettings.settingsファイルに設定を追加すると、入力したすべての情報がファイルのエントリapp.configとしても表示されます。どうやら、同期メカニズムが存在します。ファイルの設定を変更すると、次にエディターでファイルを開いたときにVisualStudioからファイルapp.configを更新するように求められます。Settings.settings

私の質問は次のとおりです。

  • なぜ1つだけではなく2つのメカニズムなのか?
  • app.configoverを使用するための最も一般的なシナリオは何Settings.settingsですか?
  • アプリが使用していて、デプロイ後にSettings.settings値を変更するとどうなりますか?すでにコンパイルおよび配布されているため、のapp.config同期は発生しません。Settings.settings

ノート。このトピックに関する質問を検索しましたが、さらに混乱しています。たとえば、ここでのこの質問への回答はかなり矛盾しており、あまり光を当てていません。

注2.これがapp.config設計時のファイル名であることを認識しており、VisualStudioがファイルを実行可能フォルダーにコピーして名前を変更するダイナミクスに精通しています。

4

2 に答える 2

57

なぜ1つだけではなく2つのメカニズムなのか?

それらは異なる目的を果たします。設定APIはアプリケーションからの読み取り/書き込みアクセスを提供しますが、構成は読み取り専用です(ファイルをコードで記述しない限り)。

設定は、ユーザーごとまたはアプリケーションごとに定義でき、揮発性になるように設計されています。ユーザー設定は、UACで許可されているユーザープロファイルストレージ内の隠しフォルダーに書き込まれます。

App.configはアプリケーションごとのみです。App.configへの変更は自動的に取得されません。値を更新するには、再起動またはコードが必要です。UACでは、ユーザーはプログラムファイルなどのアプリケーションディレクトリへの書き込みを許可されていないため、このファイルは静的な読み取り専用と見なす必要があります。

Settings.settingsよりもapp.configを使用する、またはその逆の場合の最も一般的なシナリオは何ですか?

デスクトップアプリケーションの[設定]を使用して、ユーザー設定や実行時に変更される設定を保存できます。

App.configは、接続文字列などのより一般的な静的設定、またはアプリ内で使用されるコンポーネントの構成を定義するために使用します。

アプリがSettings.settingsを使用していて、デプロイ後にapp.configの値を変更するとどうなりますか?

アプリケーションが再デプロイされると、マシンにユーザー/アプリのカスタマイズが既に存在しない限り、新しい設定が取得されます。その場合、それらをワイプしない限り、アプリケーションは引き続きそれらを使用します。

新しい設定を追加すると、これらが取得されます。実際、デフォルト値はSettingsクラスに組み込まれているため、app.configが空の場合でも、Settingsは機能します。

于 2011-09-18T10:26:37.777 に答える
32

.NET Frameworkの観点から(現時点ではツールとは言えません-Visual Studio-)、歴史的には、[app.exe].config(実際には、AppDomainが構成ファイルとして定義するものです。名前はAppDomainによって定義されます。つまり、なぜそれweb.configがWebアプリ用なのか...)そしてmachine.config。「app」はアプリケーションと一緒にデプロイされ、「machine」はマシン全体を表します。それらは、平均的なユーザーにとっては「かなり」読み取り専用であると想定されていました。それらを変更することは可能ですが、それは考えではありませんでした。

しかし、どうすればエンドユーザーの設定を保存できますか?そのため、[user] .configが導入されました(.NET 2を使用していると思います)。公式ドキュメントには次のように書かれています。

.NET Frameworkで最初にリリースされた構成システムは、ローカルコンピューターのmachine.configファイルを介して、またはアプリケーションとともに展開するapp.exe.configファイル内で静的アプリケーション構成データを提供することをサポートします。LocalFileSettingsProviderクラスは、このネイティブサポートを次の方法で拡張します。

1)アプリケーションスコープの設定は、machine.configファイルまたはapp.exe.configファイルのいずれかに保存できます。Machine.configは常に読み取り専用ですが、app.exe.configはセキュリティ上の理由から、ほとんどのアプリケーションで読み取り専用に制限されています。

2)ユーザースコープの設定は、app.exe.configファイルに保存できます。この場合、静的なデフォルトとして扱われます。

3)デフォルト以外のユーザースコープ設定は、新しいファイルuser.configに保存されます。ここで、userは、現在アプリケーションを実行しているユーザーのユーザー名です。DefaultSettingValueAttributeを使用して、ユーザースコープ設定のデフォルトを指定できます。ユーザースコープの設定はアプリケーションの実行中に変更されることが多いため、user.configは常に読み取り/書き込みです。

したがって、.NET Frameworkの観点からは、3層メカニズムは1つだけです。

これで、Visual Studioは、最終的な読み取り/書き込み設定用のタイプセーフなコードを生成することで、ユーザーを支援しようとします。ほとんどの場合、その[user] .configファイルは存在せず、設定値はDefaultSettingValueAttribute(各設定に対して定義された)内容によって定義されるか、app.configで静的に定義されたものを使用します。そのため、Visual Studioはapp.configファイルも更新するため、静的なデフォルトを設定に定義できます。ただし、app.configのものはすべて完全に削除できます。

于 2012-10-25T16:21:49.637 に答える