在运行时更新app.config中system.net设置

25

我需要在运行时更新一个 .Net exe app.config 文件的 system.net SectionGroup 中的设置。运行时我没有写入原始配置文件的权限(我正在开发一个 .Net dll 加载项,它托管在由应用提供的我无法控制的 exe 中),所以我希望保存一个文件副本,并在运行时用修改后的版本替换 exe 中的配置。我尝试了以下方法,但它不起作用。有什么建议吗?

    Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
    NetSectionGroup netSectionGroup = config.GetSectionGroup("system.net") as NetSectionGroup;
    netSectionGroup.Settings.HttpWebRequest.UseUnsafeHeaderParsing = true;                      
    config.SaveAs(@"C:\ProgramData\test.config", ConfigurationSaveMode.Full);

    AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", @"C:\ProgramData\test.config");
3个回答

44

从您的问题中,我无法理解您是因为自己的设计实现而无法访问app.config文件,还是因为无法保存配置文件。因此,这里提供一段代码,可以允许您在运行时修改并保存配置文件中的appSettings部分:

Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
KeyValueConfigurationCollection settings = config.AppSettings.Settings;

// update SaveBeforeExit
settings[-keyname-].Value = "newkeyvalue";
...
//save the file
config.Save(ConfigurationSaveMode.Modified);
//relaod the section you modified
ConfigurationManager.RefreshSection(config.AppSettings.SectionInformation.Name);

顺便提一句,这段代码不会保存你在解决方案编辑器中看到的app.config文件,它会更新操作文件夹中的“program_name.exe.config”文件。


1
我正在为一个 .Net 应用程序(Windows Media Center)开发插件。该插件采用 dll .Net 程序集的形式,加载到由 Media Center exe (ehshell.exe) 管理的独立主机进程 (ehexthost.exe) 中。由于原始 app.config 文件的位置,我无法保存到主机进程中,因此需要保存到替代路径。另外,我想对 system.net SectionGroup 进行更改,而不是 AppSettings。 - mthornal
我可以确认这也适用于.NET 4.0。(感谢@AlexDrenea!)对我来说关键(请原谅双关语)是将设置设为如下所示:<configuration> <appSettings> <add key="blahblah" value="bloog" /> </appSettings> </configuration> - AndrewJacksonZA
1
确认过了... 它不会保存在调试模式下。只有在bin文件夹中运行.exe时才会保存。我没有看到它保存在“program_name.exe.config”文件中的任何证据。 - bizah

3

使用System.Configuration命名空间;

    public void save_new_connection()
    {

      string ConStrng = ConfigurationManager.ConnectionStrings.ToString();
      ConnectionStringSettings conSetting = new ConnectionStringSettings();

      conSetting.ConnectionString="server=localho;UserId=root;password=mypass;database=night_anglecourier"; 
      conSetting.Name = "courier.Properties.Settings.night_anglecourierConnectionString";
      conSetting.ProviderName = "MySql.Data.MySqlClient";

      System.Configuration.Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);

        ConnectionStringsSection conSettings = (ConnectionStringsSection)config.GetSection("connectionStrings");
        conSettings.ConnectionStrings.Remove(conSetting);
        conSettings.ConnectionStrings.Add(conSetting);

        config.Save(ConfigurationSaveMode.Modified);
        ConfigurationManager.RefreshSection(config.AppSettings.SectionInformation.Name);


    }

1
通过这段代码,我已经在配置文件的应用程序设置中更改了连接字符串...希望这能对你有所帮助。
string ConStrng = ConfigurationSettings.AppSettings["ConnectionString"];
            string sss = "Data Source=";
            string xxx = ";Initial Catalog=AlfalahScholarship;Integrated Security=True";
            //ConfigurationSettings.AppSetting;
            System.Configuration.Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
            //Get the appSettings section.
            AppSettingsSection appSettings = (AppSettingsSection)config.GetSection("appSettings");
            appSettings.Settings.Remove("ConnectionString");
            appSettings.Settings.Add("ConnectionString", sss + txtServerName.Text + xxx);

            config.Save(ConfigurationSaveMode.Modified);
            ConfigurationManager.RefreshSection(config.AppSettings.SectionInformation.Name);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接