热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

深入解析C#中app.config文件的配置与修改方法

在C#开发过程中,经常需要对系统的配置文件进行读写操作,如系统初始化参数的修改或运行时参数的更新。本文将详细介绍如何在C#中正确配置和修改app.config文件,包括其结构、常见用法以及最佳实践。此外,还将探讨exe.config文件的生成机制及其在不同环境下的应用,帮助开发者更好地管理和维护应用程序的配置信息。

    很多时候我们需要对系统的.config文件进度读写操作,例如:系统初始化的参数的更改、系统参数的改变都需要更新到配置文件。

    首先我们有必要了解一下app.config、exe.config和vshost.exe.config作用和区别:

    vshost.exe.config是程序运行时的配置文本,exe.config是程序运行后会复制到vshost.exe.config,app.config是在vshost.exe.config和exe.config没有情况起作用,从app.config复制到exe.config再复制到vshost.exe.config。vshost.exe.config和exe.config会自动创建内容跟app.config一样。了解过这些其实写配置文件都是写到exe.config文件中了,app.config不会变化。网上也有许多关于配置文件的读写操作,也是借鉴了多位前辈的经验自己总结的一些比较常用的读写操作。废话不多说,直接上主题:

  1. appSetting节点
     1           /// 
     2          /// 修改AppSettings中配置
     3          /// 
     4          /// key值
     5          /// 相应值
     6          public static bool SetConfigValue(string key, string value)
     7          {
     8              try
     9              {
    10                  Configuration cOnfig= ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
    11                  if (config.AppSettings.Settings[key] != null)
    12                      config.AppSettings.Settings[key].Value = value;
    13                  else
    14                      config.AppSettings.Settings.Add(key, value);
    15                  config.Save(ConfigurationSaveMode.Modified);
    16                  ConfigurationManager.RefreshSection("appSettings");
    17                  return true;
    18              }
    19              catch
    20              {
    21                  return false;
    22              }
    23          }
    修改或新增AppSetting节点

     

     1         /// 
     2         /// 获取AppSettings中某一节点值
     3         /// 
     4         /// 
     5         public static string GetConfigValue(string key)
     6         {
     7                 Configuration cOnfig= ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
     8                 if (config.AppSettings.Settings[key] != null)
     9                      return  config.AppSettings.Settings[key].Value;
    10                 else
    11                   
    12                 return string.Empty;
    13         }    
    获取AppSetting节点值

     

  2. ConnectionStrings节点

     1         /// 
     2         /// 获取连接节点值
     3         /// 
     4         /// 
     5         /// 
     6         public static string GetConnectionValue(string key)
     7         {
     8             if (ConfigurationManager.ConnectionStrings[key] != null)
     9                 return ConfigurationManager.ConnectionStrings[key].ConnectionString;
    10             return string.Empty;
    11         }    
    获取ConnectionStrings节点值  
     
     1  public static void UpdateConnectionStringsConfig(string key, string conString)
     2         {
     3             bool isModified = false;    //记录该连接串是否已经存在 
     4             if (ConfigurationManager.ConnectionStrings[key] != null)
     5             {
     6                 isModified = true;
     7             }
     8             //新建一个连接字符串实例 
     9             ConnectionStringSettings mySettings = new ConnectionStringSettings(key, conString);
    10 
    11             // 打开可执行的配置文件*.exe.config 
    12             Configuration cOnfig= ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
    13 
    14             // 如果连接串已存在,首先删除它 
    15             if (isModified)
    16             {
    17                 config.ConnectionStrings.ConnectionStrings.Remove(key);
    18             }
    19             // 将新的连接串添加到配置文件中. 
    20             config.ConnectionStrings.ConnectionStrings.Add(mySettings);
    21             // 保存对配置文件所作的更改 
    22             config.Save(ConfigurationSaveMode.Modified);
    23             // 强制重新载入配置文件的ConnectionStrings配置节  
    24             ConfigurationManager.RefreshSection("connectionStrings");
    25         }
    修改或新增ConnectionStrings节点

     

  3. System.ServiceModel节点

     1         /// 
     2         /// 读取EndpointAddress
     3         /// 
     4         /// 
     5         /// 
     6         public static string GetEndpointClientAddress(string endpointName)
     7         {
     8             ClientSection clientSection = ConfigurationManager.GetSection("system.serviceModel/client") as ClientSection;
     9             foreach (ChannelEndpointElement item in clientSection.Endpoints)
    10             {
    11                 if (item.Name == endpointName)
    12                     return item.Address.ToString();
    13             }
    14             return string.Empty;
    15         }
    16 
    17 
    18         /// 
    19         /// 设置EndpointAddress
    20         /// 
    21         /// 
    22         /// 
    23         public static bool SetEndpointClientAddress(string endpointName, string address)
    24         {
    25             try
    26             {
    27                 Configuration cOnfig= ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
    28                 ClientSection clientSection = config.GetSection("system.serviceModel/client") as ClientSection;
    29                 foreach (ChannelEndpointElement item in clientSection.Endpoints)
    30                 {
    31                     if (item.Name != endpointName)
    32                         continue;
    33                     item.Address = new Uri(address);
    34                     break;
    35                 }
    36                 config.Save(ConfigurationSaveMode.Modified);
    37                 ConfigurationManager.RefreshSection("system.serviceModel");
    38                 return true;
    39             }
    40             catch (Exception ex)
    41             {
    42                 return false;
    43             }
    44 
    45         }
    客户端Client的Endpoint
     
    服务端Service的Address

     

     

     对与配置文件的修改有些可能会觉得直接操作config文件对安全性来说代价太高了,这种情况下就需要个人取决一下可以使用将appconfig段放到独立的config文件中,以XML的方式进行修改,并可以避免应用程序重启的问题。

     简单的再说一下放到独立文件的操作

      

     剩下的就是对xml的操作

      

      
 1              string COnnectConfigPath= AppData.StartupPath + "\\Config\\DaoConfig.xml";//获取配置文件路径
 2 
 3                 //向DaoConfig里添加节点
 4                 XmlDocument xmlDoc = new XmlDocument();
 5                 xmlDoc.Load(ConnectConfigPath);
 6                 XmlNode xmldocSelect = xmlDoc.SelectSingleNode("/DaoConfig[1]");
 7 
 8                 xmldocSelect.RemoveAll();//删除当前节点的所有子节点
 9 
10                 //添加test节点
11                 XmlElement Account = xmlDoc.CreateElement("test");
12                 Account.InnerText = "对应的值";
13                 xmldocSelect.AppendChild(Account);
14 
15 
16                 xmlDoc.Save(ConnectConfigPath);    
Dao.config文件新增节点的操作

 


推荐阅读
  • 毕业设计:基于机器学习与深度学习的垃圾邮件(短信)分类算法实现
    本文详细介绍了如何使用机器学习和深度学习技术对垃圾邮件和短信进行分类。内容涵盖从数据集介绍、预处理、特征提取到模型训练与评估的完整流程,并提供了具体的代码示例和实验结果。 ... [详细]
  • 在维护公司项目时,发现按下手机的某个物理按键后会激活相应的服务,并在屏幕上模拟点击特定坐标点。本文详细介绍了如何使用ADB Shell Input命令来模拟各种输入事件,包括滑动、按键和点击等。 ... [详细]
  • 本文介绍了两种方法,用于检测 Android 设备是否开启了开发者模式。第一种方法通过检查 USB 调试模式的状态,第二种方法则直接判断开发者选项是否启用。这两种方法均提供了代码示例和详细解释。 ... [详细]
  • MySQL索引详解与优化
    本文深入探讨了MySQL中的索引机制,包括索引的基本概念、优势与劣势、分类及其实现原理,并详细介绍了索引的使用场景和优化技巧。通过具体示例,帮助读者更好地理解和应用索引以提升数据库性能。 ... [详细]
  • 本文探讨了《魔兽世界》中红蓝两方阵营在备战阶段的策略与实现方法,通过代码展示了双方如何根据资源和兵种特性进行战士生产。 ... [详细]
  • 深入理解Redis的数据结构与对象系统
    本文详细探讨了Redis中的数据结构和对象系统的实现,包括字符串、列表、集合、哈希表和有序集合等五种核心对象类型,以及它们所使用的底层数据结构。通过分析源码和相关文献,帮助读者更好地理解Redis的设计原理。 ... [详细]
  • 本文将详细探讨Linux pinctrl子系统的各个关键数据结构,帮助读者深入了解其内部机制。通过分析这些数据结构及其相互关系,我们将进一步理解pinctrl子系统的工作原理和设计思路。 ... [详细]
  • 题目Link题目学习link1题目学习link2题目学习link3%%%受益匪浅!-----&# ... [详细]
  • 本实验主要探讨了二叉排序树(BST)的基本操作,包括创建、查找和删除节点。通过具体实例和代码实现,详细介绍了如何使用递归和非递归方法进行关键字查找,并展示了删除特定节点后的树结构变化。 ... [详细]
  • PHP 5.5.0rc1 发布:深入解析 Zend OPcache
    2013年5月9日,PHP官方发布了PHP 5.5.0rc1和PHP 5.4.15正式版,这两个版本均支持64位环境。本文将详细介绍Zend OPcache的功能及其在Windows环境下的配置与测试。 ... [详细]
  • Scala 实现 UTF-8 编码属性文件读取与克隆
    本文介绍如何使用 Scala 以 UTF-8 编码方式读取属性文件,并实现属性文件的克隆功能。通过这种方式,可以确保配置文件在多线程环境下的一致性和高效性。 ... [详细]
  • 本文详细介绍了 MySQL 中 LAST_INSERT_ID() 函数的使用方法及其工作原理,包括如何获取最后一个插入记录的自增 ID、多行插入时的行为以及在不同客户端环境下的表现。 ... [详细]
  • 在多线程编程环境中,线程之间共享全局变量可能导致数据竞争和不一致性。为了解决这一问题,Linux提供了线程局部存储(TLS),使每个线程可以拥有独立的变量副本,确保线程间的数据隔离与安全。 ... [详细]
  • 本文探讨了在Java多线程环境下,如何确保具有相同key值的线程能够互斥执行并按顺序输出结果。通过优化代码结构和使用线程安全的数据结构,我们解决了线程同步问题,并实现了预期的并发行为。 ... [详细]
  • 本文将深入探讨如何在不依赖第三方库的情况下,使用 React 处理表单输入和验证。我们将介绍一种高效且灵活的方法,涵盖表单提交、输入验证及错误处理等关键功能。 ... [详细]
author-avatar
谢淑萍066347
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有