7

つまり、簡単に言うと、アプリケーション自体を通じて実行時に変更される可能性のある構成情報を利用するアプリケーションを開発しています。Settings目的のために、クラスを使用することを考えました。

問題は、アプリケーションの異なる実行間で情報が保持されないことです。

実行 1)

Console.WriteLine(Settings.Default["User"]); //prints "Default user"
Settings.Default["User"] = "abc";
Console.WriteLine(Settings.Default["User"]); //prints "abc"

実行 2)

Console.WriteLine(Settings.Default["User"]); //prints "Default user"
Settings.Default["User"] = "abc";
Console.WriteLine(Settings.Default["User"]); //prints "abc"

(どちらもまったく同じ出力を出力します)

どちらの実行でも同じ最初の出力「デフォルトユーザー」が表示されますが、2回目の実行では「abc」を取得したいので、異なるアプリケーション実行間で情報が保持されていないことを示しています。

これは、Visual Studio が .config ファイルを処理する方法に関連している必要があることを認めますが、それでも、この (厄介な) 動作を修正する方法を知りたいですか?

4

5 に答える 5

7

デフォルトでは、App.config は直接コピーされず、コンテンツは<assembly-name>.config出力フォルダーのファイルに配置されます。コピー設定は、この操作には適用されません。

一般に、アプリケーションが独自の app.config を変更することはお勧めできません。同じ PC で複数のユーザーが使用する可能性のあるアプリケーションを開発している場合は、代わりに[設定] を使用してください。このようにして、各ユーザーは独自の設定を持つことができます。

サービスとシステム全体の設定については、別の構成ファイル、レジストリ、またはデータベースなど、別のストレージの使用を検討してください。

設定の保存に関する編集:

設定クラスを使用する場合は、Save() を呼び出してファイルに書き込む必要があります。そうしないと、アプリケーションを閉じたときに設定の変更が破棄されます。開発中にアプリケーションを頻繁に終了し、終了コード (通常は Save() を呼び出す場所) に到達しない場合は、いくつかのオプションがあります。

  1. Save() を呼び出すには、デバッガーのウォッチ ウィンドウを使用します。これを行うには、Settings.Default.Save()ウォッチ ウィンドウのような式を配置し、保存するたびに更新します。
  2. タイマーを使用して、毎秒 Save を呼び出すことができます。
  3. 設定の変更後にコードに Save() 呼び出しを挿入できます。
  4. 変更のたびに設定をすぐに保存するカスタム設定プロバイダーまたはラッパーを作成できます。
于 2013-03-24T08:51:55.470 に答える
2

以下は、何かを app.config ファイルに保存するために使用したものです。

//write the last run time to config
Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);

if (config.AppSettings.Settings["LastRunTime"] == null)
{
    config.AppSettings.Settings.Add("LastRunTime", DateTime.UtcNow.ToString());
}
else
{
    config.AppSettings.Settings["LastRunTime"].Value = DateTime.UtcNow.ToString();
}
config.Save();

お役に立てれば。

于 2013-04-03T15:52:23.213 に答える
1

これがあなたのアプローチとどう違うのかわかりませんが、設定ファイルを使用してこの問題を解決しました。

まず、プロジェクトの [プロパティ] メニューから設定ファイルを作成します。ソリューション エクスプローラーでプロジェクトを右クリックし、[プロパティ] を選択します。[設定] タブに移動し、設定ファイルを作成します。ファイルが作成されると、名前/タイプ/スコープ/値を入力できるデータグリッドが表示されます。ここで使用するすべての変数を設定します (実行時にさらに変数を作成できるかどうかはわかりませんが、そうは思いません)。

これで、コードで、プロジェクトの既定の名前空間にある Properties クラスを使用できるようになりました。

設定を読み取るには:

Properties.Settings.Default.SrcDir;

設定を保存するには:

Properties.Settings.Default.SrcDir = src;
Properties.Settings.Default.Save();
于 2013-04-01T20:35:48.590 に答える
-1

おそらく、ファイルシステムを使用して2つのファイル間にシンボリックリンクを作成し、ソース内のファイルを実際に編集できるようにすることができます. ただし、コンパイラが構成ファイルを上書きしないようにする (したがって、リンクを削除する) ための簡単な解決策は考えられません。

少なくとも、このアプローチでは、回避策をコーディングする必要はありません。また、設定を保存する方法にも影響しません (既定からユーザー スコープへの変更など)。そのため、開発中のみ有効です。

于 2013-04-04T14:17:30.137 に答える