zoukankan      html  css  js  c++  java
  • Config文件的使用:通过程序修改Config文件

    对于config文件,一般情况下都是使用ConfigurationManager加载,然后通过读取相应节点的值来获取想要的数据,但是,有时候需要修改config文件的值,这时候就用到了OpenExeConfiguration()方法。

    MSDN上面对该方法的解释:ConfigurationManager.OpenExeConfiguration方法用来把指定的客户端配置文件作为Configuration对象打开,该方法具有两个重载:

    名称 说明
    ConfigurationManager.OpenExeConfiguration (ConfigurationUserLevel) 将当前应用程序的配置文件作为 Configuration 对象打开。
    ConfigurationManager.OpenExeConfiguration (String) 将指定的客户端配置文件作为 Configuration 对象打开。

    一、使用OpenExeConfiguration(ConfigurationUserLevel)重载设置当前应用程序的配置文件

    客户端应用程序使用应用于所有用户的全局配置、应用于单个用户的单独配置以及应用于漫游用户的配置。userLevel 参数通过指示该配置文件是不具有用户级别(配置文件与应用程序位于同一目录中),还是具有一个依每个用户而定的用户级别(配置文件位于用户级别所确定的应用程序设置路径中),从而确定所打开的配置文件的位置。

    通过向 userLevel 传递下列值之一来指定要获取的配置:

    • 若要获取应用于所有用户的 Configuration 对象,请将 userLevel 设置为 None。

    • 若要获取应用于当前用户的本地 Configuration 对象,请将 userLevel 设置为 PerUserRoamingAndLocal。

    • 若要获取应用于当前用户的漫游 Configuration 对象,请将 userLevel 设置为 PerUserRoaming。

    注意:若要获取资源的 Configuration 对象,您的代码必须对它从中继承设置的所有配置文件具有“读取”特权。若要更新配置文件,您的代码还必须对该配置文件及其所在目录具有“写入”特权。

    示例程序:

    1、配置文件结构如下:

     1 <?xml version="1.0" encoding="utf-8" ?>
     2 <configuration>
     3   <appSettings>
     4     <add key="ApServer1" value="ApServer1"/>
     5     <add key="ApServer2" value="ApServer2"/>
     6     <add key="LocalHost1" value="LocalHost1"/>
     7     <add key="LocalHost2" value="LocalHost2"/>
     8     <add key="addr" value="11111"/>
     9   </appSettings>
    10     <startup> 
    11         <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    12     </startup>
    13 </configuration>

    2、通过程序修改LocalHost1节点的值

     string strLocalHost1Value1 = ConfigurationManager.AppSettings["LocalHost1"].ToString(); //strLocalHost1Value1="LocalHost1";
    //Configuration对象
    Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
    config.AppSettings.Settings["LocalHost1"].Value = "http://127.0.0.1";
    
    //保存配置文件
    config.AppSettings.SectionInformation.ForceSave = true;
    config.Save(ConfigurationSaveMode.Modified);
    //重新加载改变的节点
    ConfigurationManager.RefreshSection("appSettings");
    
    //读取配置文件的值
    string strLocalHost1Value2 = ConfigurationManager.AppSettings["LocalHost1"].ToString();//strLocalHost1Value2="http://127.0.0.1"

    二、使用OpenExeConfiguration(String)重载设置指定的客户端配置文件

    重载指定的客户端config文件主要包括下面3种情况:

    1、加载非当前应用程序yyy.exe默认的config文件的xxx.exe.config文件(yyy.exe是当前应用程序,xxx.exe.config与yyy.exe.config文件不在同一目录下)。

    2、加载非应用程序的xxx.config文件。

    3、让类库xxx.dll内的函数读取默认config文件的时候,读取的是xxx.dll同级目录下的xxx.dll.config文件,而不是加载xxx.dll的应用程序yyy.exe的默认应用程序配置文件:yyy.exe.config。

    注意:在类库中使用ConfigruationManager读取的不是自动编译生成的xxx.dll.config文件,而是引用类库的应用程序yyy.exe的yyy.exe.config文件。

    解决方法:

    按照MSDN上的说明,我们把要打开的xxx.exe.config的路径作为参数传入,代码如下:

    1 Configuration con = ConfigurationManager.OpenExeConfiguration("C:\Modify.exe.config");
    2 con.AppSettings.Settings["LocalHost2"].Value = "测试";

    但是程序运行的时候报错,经过调试,发现con对象的FilePath属性的值为:C:Modify.exe.config.config,程序自己在传入的参数后增加了“.config”作为要打开的config文件的路径,因为没有这个文件,所以程序报错。这里要传入的参数,不应该是要打开的config文件的路径,而是这个config文件对应的应用程序的路径,上面的代码应修改为:

    1 //参数传的是应用程序的路径
    2 Configuration con = ConfigurationManager.OpenExeConfiguration("C:\Modify.exe.");
    3 con.AppSettings.Settings["LocalHost2"].Value = "测试";

    再次运行程序,还是报错,提示“加载配置文件时出错:参数exePath”无效。这里要传入应用程序的路径(exePath)没错,但是因为在xxx.exe.config文件的同一目录下,没有xxx.exe文件,因此我们传入的exePath实际上是无效的,为了能够加载xxx.exe.config文件,需要在同一目录下增加一个xxx.exe文件。(可以在同一目录下新建一个txt文件,修改名称为xxx,扩展名为.exe,这样就可以加载xxx.exe.config配置文件了)

    完整的代码如下:

    //参数传的是应用程序的路径
    Configuration con = ConfigurationManager.OpenExeConfiguration("C:\Modify.exe");
    con.AppSettings.Settings["LocalHost2"].Value = "测试";
    //保存配置文件
    con.AppSettings.SectionInformation.ForceSave = true;
    con.Save(ConfigurationSaveMode.Modified);
    //重新加载改变的节点
    ConfigurationManager.RefreshSection("appSettings");
    
    //读取修改后的配置文件节点值
    string str = con.AppSettings.Settings["LocalHost2"].Value;//str="测试"

    注意:

    使用ConfigurationManager.OpenExeConfiguration(string exePath)即可,同时注意2个小细节:
    A:改方法需传入的是exePath,而不是configPath;
    B:exePath必须是有效的,因此xxx.exe和xxx.exe.config应该成对出现,缺一不可。

    加载非应用程序的xxx.config文件

    在上面的例子中,观察xxx.exe.config文件的名称,发现,若把xxx.exe看成YYY,则xxx.exe.config=YYY.config,也就是说:xxx.exe.config是xxx.config文件的一种特殊形式,所以,可以使用如下的代码加载xx.config文件:

    //参数传的是应用程序的路径
    Configuration con = ConfigurationManager.OpenExeConfiguration("C:\Modify");
    con.AppSettings.Settings["LocalHost2"].Value = "测试";
    //保存配置文件
    con.AppSettings.SectionInformation.ForceSave = true;
    con.Save(ConfigurationSaveMode.Modified);
    //重新加载改变的节点
    ConfigurationManager.RefreshSection("appSettings");
    
    //读取修改后的配置文件节点值
    string str = con.AppSettings.Settings["LocalHost2"].Value;//str="测试"

    注意:C:Modify这个文件必须要有。

    加载xxx.dll.config文件:

    还是从文件名上来找思路,我们要加载xxx.dll.config文件,可以和加载xxx.config文件一样。在dll内,碰到需要读取config文件信息的时候,放弃使用ConfigurationManager读取节点的值,而是使用OpenExeConfiguration(string exePath)方法加载config文件为一个Configuration对象来使用。

    注意:通过程序修改配置文件中节点的值,不会修改.config文件里面的值,更改只是发生在内存中。

  • 相关阅读:
    在日本被禁止的コンプガチャ設計
    Starling常见问题解决办法
    Flixel引擎学习笔记
    SQLSERVER中修复状态为Suspect的数据库
    T4 (Text Template Transformation Toolkit)实现简单实体代码生成
    创建Linking Server in SQL SERVER 2008
    Linq to Sql 与Linq to Entities 生成的SQL Script与分页实现
    Linq to Entity 的T4 模板生成代码
    在VisualStudio2008 SP1中调试.net framework 源代码
    使用HttpModules实现Asp.net离线应用程序
  • 原文地址:https://www.cnblogs.com/dotnet261010/p/6597177.html
Copyright © 2011-2022 走看看