2012-02-08 14 views
7

app.configの設定は、実際にアプリケーションによっていつ読み込まれますか?app.configの設定はいつ実際に読み取られますか?

Windowsサービスとそのためのアプリ設定があるとします。コードでは、いくつかの設定が使用されるメソッドがあります。メソッドはすべての反復で呼び出されており、常時1回だけではありません。設定ファイルを使って設定値を変更した場合、サービスを再起動する必要がありますか?内部で「更新」するか、次回は私の側からの操作なしに受け入れられますか?

答えて

5

ディスクから直接読み取った最新の値を取得するには、ConfigurationManager.RefreshSectionメソッドを呼び出す必要があります。

static void Main(string[] args) 
{ 
    while (true) 
    { 
     // There is no need to restart you application to get latest values. 
     // Calling this method forces the reading of the setting directly from the config. 
     ConfigurationManager.RefreshSection("appSettings"); 
     Console.WriteLine(ConfigurationManager.AppSettings["myKey"]); 

     // Or if you're using the Settings class. 
     Properties.Settings.Default.Reload(); 
     Console.WriteLine(Properties.Settings.Default.MyTestSetting); 

     // Sleep to have time to change the setting and verify. 
     Thread.Sleep(10000); 
    } 
} 

マイapp.configを含む:あなたがアプリケーションを起動した後

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <configSections> 
    <sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" > 
     <section name="ConsoleApplication2.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" /> 
    </sectionGroup> 
    </configSections> 
    <appSettings> 
    <add key="myKey" value="Original Value"/> 
    </appSettings> 
    <userSettings> 
    <ConsoleApplication2.Properties.Settings> 
     <setting name="MyTestSetting" serializeAs="String"> 
     <value>Original Value</value> 
     </setting> 
    </ConsoleApplication2.Properties.Settings> 
    </userSettings> 
</configuration> 

は、buildフォルダ内のapp.configを開き、ここでテストし、あなたの質問に答えを提供するための簡単な方法ですappSetting "myKey"の値を変更します。新しい値がコンソールに表示されます。

質問に答えるために、はい、私は思ったとおりに最初にキャッシュされ、ディスクから直接読み込みを強制するには、セクションをリフレッシュする必要があります。

+0

このような設定をしたら:Properties.Settings.Default.MyValue? Properties.Settings.Default.Reload();を使用して – 26071986

+0

を呼び出します。 – mservidio

+0

@ 26071986 - 私はSettingsクラスを使用するときのコードを反映するために私の答えを更新しました。 – mservidio

1

構成マネージャー(ConfigurationManager.GetSection( "x/y");)またはプロパティーにアクセスしようとするときに、そのどちらかをロードします。

あなたが設定マネージャを経由して設定を取得するときので、わずかな灰色の領域がここにあります:

var config = (MyConfigSection)ConfigurationManager.GetSection("MyConfigSection"); 

あなたがでconfigurationSections要素で構成セクションの種類を提供している場合は、背面の構成オブジェクトを取得設定ファイルの一番上。実際の設定を実際に提供していない場合でも、オブジェクトは戻ってきます。

ただし、必須フィールドが設定されていない場合は、プロパティを呼び出すまで例外は発生しません。私はカスタム設定セクションを単体テストしようとしている間にこれを試しました。

関連する問題