簡體   English   中英

App.Config更改值

[英]App.Config change value

這是我的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);
}

但它沒有改變。 我做錯了什么?

AppSettings.Set不會將更改保留在配置文件中。 它只是在內存中改變它。 如果在System.Configuration.ConfigurationManager.AppSettings.Set("lang", lang);上放置斷點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

上面提到的一個要點是,如果從調試器(在Visual Studio中)運行它,那么每次構建時都會覆蓋app.config文件。 測試此方法的最佳方法是構建應用程序,然后導航到輸出目錄並從那里啟動可執行文件。 在輸出目錄中,您還可以找到名為YourApplicationName.exe.config的文件,它是您的配置文件。 在記事本中打開它,看看實際上已保存更改。

您不能使用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(); 

當使用“ ConfigurationUserLevel.None ”時,當您單擊調試文件夾中的nameyourapp.exe時,您的代碼會正確運行。
但是當你在visual 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);

我的英語不好,對不起。

這在WPF應用程序中對我有用:

string configPath = Path.Combine(System.Environment.CurrentDirectory, "YourApplication.exe");
Configuration config = ConfigurationManager.OpenExeConfiguration(configPath);
config.AppSettings.Settings["currentLanguage"].Value = "En";
config.Save();
    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");
    }

除了fenix2222的答案(對我有用),我不得不修改最后一行:

config.Save(ConfigurationSaveMode.Modified);

如果沒有這個,新值仍然被寫入配置文件,但在調試時檢索舊值。

對於.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");
}

只有第一行是不同的,在實際執行的程序集上構造。

謝謝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;

    }

要更新appsettings以外的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值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM