web-dev-qa-db-ja.com

App.Config変更値

これは私のApp.Configです

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <add key="lang" value="English"/>
  </appSettings>
</configuration>

このコードで変更を行います

lang = "Russian";
private void Main_FormClosing(object sender, FormClosingEventArgs e)
{
     System.Configuration.ConfigurationManager.AppSettings.Set("lang", lang);
}

しかし、それは変わりません。私が間違っているのは何ですか?

40
a1204773

これにはAppSettings静的オブジェクトを使用できません。これを試して

string appPath = System.IO.Path.GetDirectoryName(Reflection.Assembly.GetExecutingAssembly().Location);          
string configFile = System.IO.Path.Combine(appPath, "App.config");
ExeConfigurationFileMap configFileMap = new ExeConfigurationFileMap();         
configFileMap.ExeConfigFilename = configFile;          
System.Configuration.Configuration config = ConfigurationManager.OpenMappedExeConfiguration(configFileMap, ConfigurationUserLevel.None);

config.AppSettings.Settings["YourThing"].Value = "New Value"; 
config.Save(); 
46
fenix2222

AppSettings.Setは、構成ファイルへの変更を永続化しません。メモリ内で変更するだけです。 System.Configuration.ConfigurationManager.AppSettings.Set("lang", lang);にブレークポイントを設定し、System.Configuration.ConfigurationManager.AppSettings[0]のウォッチを追加すると、そのコード行の実行時に「英語」から「ロシア語」に変わることがわかります。

次のコード(コンソールアプリケーションで使用)は、変更を永続化します。

class Program
{
    static void Main(string[] args)
    {
        UpdateSetting("lang", "Russian");
    }

    private static void UpdateSetting(string key, string value)
    {
        Configuration configuration = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
        configuration.AppSettings.Settings[key].Value = value;
        configuration.Save();

        ConfigurationManager.RefreshSection("appSettings");
    }
}

この投稿から:http://vbcity.com/forums/t/152772.aspx

上記で注意すべき重要な点の1つは、これをデバッガー(Visual Studio内)から実行している場合、ビルドするたびにapp.configファイルが上書きされることです。これをテストする最良の方法は、アプリケーションをビルドしてから出力ディレクトリに移動し、そこから実行可能ファイルを起動することです。出力ディレクトリ内には、構成ファイルであるYourApplicationName.exe.configという名前のファイルもあります。これをメモ帳で開き、変更が実際に保存されたことを確認します。

88
Kevin Aenmey

"ConfigurationUserLevel.None"を使用すると、デバッグフォルダーのnameyourapp.exeをクリックすると、コードが正しく実行されます。 。
しかし、視覚的なstdioでアプリを開発するときは、正しく実行されません!! 「vshost.exe」が実行されるためです。

次のパラメーターはこの問題を解決します: "Application.ExecutablePath"

これを試してください:(VS 2012 Express for Desktopでテスト済み)

Configuration config = ConfigurationManager.OpenExeConfiguration(Application.ExecutablePath);
config.AppSettings.Settings["PortName"].Value = "com3";
config.Save(ConfigurationSaveMode.Minimal);

私の英語は良くない、すみません。

10
Amin Ghaderi

それはWPFアプリケーションで私のために働いた:

string configPath = Path.Combine(System.Environment.CurrentDirectory, "YourApplication.exe");
Configuration config = ConfigurationManager.OpenExeConfiguration(configPath);
config.AppSettings.Settings["currentLanguage"].Value = "En";
config.Save();
6
StepUp
    private static string GetSetting(string key)
    {
        return ConfigurationManager.AppSettings[key];
    }

    private static void SetSetting(string key, string value)
    {
        Configuration configuration =
            ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
        configuration.AppSettings.Settings[key].Value = value;
        configuration.Save(ConfigurationSaveMode.Full, true);
        ConfigurationManager.RefreshSection("appSettings");
    }
2
fiaharon

Fenix2222による回答(私にとってはうまくいきました)に加えて、最後の行を次のように変更する必要がありました。

config.Save(ConfigurationSaveMode.Modified);

これがないと、新しい値はまだ構成ファイルに書き込まれていましたが、デバッグ時に古い値が取得されていました。

2
djmcghin

答えてくれたJahmicに感謝します。私のために適切に働いた。

値を読み取り、文字列を返す別の便利なコードスニペット:

public static string ReadSetting(string key)
    {
        System.Configuration.Configuration cfg = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
        System.Configuration.AppSettingsSection appSettings = (System.Configuration.AppSettingsSection)cfg.GetSection("appSettings");
        return appSettings.Settings[key].Value;

    }
1
Sam Velasquez

appsettings以外のエントリを更新するには、単にXmlDocumentを使用します。

public static void UpdateAppConfig(string tagName, string attributeName, string value)
{
    var doc = new XmlDocument();
    doc.Load(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile);
    var tags = doc.GetElementsByTagName(tagName);
    foreach (XmlNode item in tags)
    {
        var attribute = item.Attributes[attributeName];
        if (!ReferenceEquals(null, attribute))
            attribute.Value = value;
    }
    doc.Save(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile);
}

これはあなたがそれを呼ぶ方法です:

Utility.UpdateAppConfig("endpoint", "address", "http://localhost:19092/NotificationSvc/Notification.svc");

Utility.UpdateAppConfig("network", "Host", "abc.com.au");

このメソッドは、appSettings値にも対応するように改善できます。

1
Barry Guvenkaya

.NET 4.0コンソールアプリケーションの場合、これらのどれも機能しませんでした。そこで、Kevn Aenmeyの答えを以下のように修正しました。

private static void UpdateSetting(string key, string value)
{
    Configuration configuration = ConfigurationManager.
        OpenExeConfiguration(Assembly.GetExecutingAssembly().Location);
    configuration.AppSettings.Settings[key].Value = value;
    configuration.Save();

    ConfigurationManager.RefreshSection("appSettings");
}

実際に実行されるアセンブリに基づいて構築される最初の行のみが異なります。

1
Jahmic