構成へのパスを取得する
このビットは非常に簡単であることが判明しました。
次のようなものを使用するだけです:
public string FileLocation
{
get { return Configuration.FilePath; }
}
private static Configuration Configuration
{
get { return OpenConfig(ConfigurationUserLevel.PerUserRoamingAndLocal); }
}
private static Configuration OpenConfig(ConfigurationUserLevel userLevel)
{
return ConfigurationManager.OpenExeConfiguration(userLevel);
}
そこに渡される列挙型には他に 2 つの値があります。None は app.config がある場所を指しているようで、PerUserRoaming は常に存在しない場所を指しているようです。これをいつ使用するのが適切なのかについて、これ以上の詳細を見つけることができませんでしたが、私の場合はそうではないようです.
上記で触れたように、この呼び出しに関する紛らわしい点の 1 つは、ファイルのパスが返されることです。これは、多くの場合、このファイルが存在しないことを意味します! ConfigurationManager と Settings (ApplicationSettingsBase から派生した自動生成されたクラス) の間のあいまいな関係が、私に多くの苦痛をもたらしました!
空の設定を保存する
いくつかの障害は次のとおりです。
settings.Settings クラスを追加すると、app.config も追加されます。これをインストールしたプログラムと一緒に出荷しない限り、プログラムのインストール済みバージョンと dev バージョンの間で異なる動作が見られます。1 つは app.config の値を使用して設定ファイルを作成し、もう 1 つは作成しません。私にとって最も簡単な解決策は、app.config を完全に削除することでした。
構成で save メソッドを使用しようとしていました。これにより、すべてのプロパティを保存するように指定でき (デフォルトの値に関係なく)、構成が変更されていない場合でも保存するように指定できます。ただし、両方のフラグを設定してこのメソッドを呼び出しても何も起こりません - デザイナーで作成した設定は、何らかの方法で設定されるまで現実的ではないようです - Configuration と ConfigurationManager は物事を行う古い方法であり、ApplicationSettingsBase はおそらく一方または両方を使用しますそれらのうち、うまく統合されていません。
さらに混乱させるために、設定を照会すると、値が含まれます (文字列の場合は "" になります)。ただし、設定を保存すると、これらの設定はファイルで指定された場所に保存されません! 実際、ファイルはまったく作成されません。app.config がある場合、デフォルトが app.config で指定されているため、上記の強制保存方法を使用するとファイルが作成されます。
解決策は、各プロパティのデフォルト値を確認してからデフォルト値を設定することです。これはノーオペレーションであるように見えますが、ゲッターは「設定がない場合はクエリ時に作成する」というロジックに従わず、代わりにデフォルト値で存在するふりをします。任意の値を設定すると、実際に設定が作成されるようです。
var somethingUnSet = _settings.Something == "";
if (somethingUnset)
_settings.Something = "";
if(somethingUnset|| somethingElseUnset)
{
_settings.Save();
ExitWithError("config needs setting up at " + _settings.FileLocation);
return;
}
最後に、これは私に望ましい結果をもたらしました-ファイルは、設定マネージャーによって指定された場所に保存され、入力が必要な空のプロパティが保存されます.UIの方が速かったと思います!!!
私はラップされた Settings オブジェクトを使用して、シングルトンを扱うことなくテストで値を変更しやすくしていました。これには、余分なコード (ファイルの場所など) を追加できるという素晴らしい副作用もあり、さらに設定を追加するときにコード生成が上書きされることを心配する必要はありません。