網(wǎng)站首頁 編程語言 正文
對于config文件,一般情況下都是使用ConfigurationManager加載,然后通過讀取相應(yīng)節(jié)點的值來獲取想要的數(shù)據(jù),但是,有時候需要修改config文件的值,這時候就用到了OpenExeConfiguration()方法。
MSDN上面對該方法的解釋:ConfigurationManager.OpenExeConfiguration方法用來把指定的客戶端配置文件作為Configuration對象打開,該方法具有兩個重載:
名稱 | 說明 |
ConfigurationManager.OpenExeConfiguration (ConfigurationUserLevel) | 將當(dāng)前應(yīng)用程序的配置文件作為?Configuration?對象打開。 |
ConfigurationManager.OpenExeConfiguration (String) | 將指定的客戶端配置文件作為?Configuration?對象打開。 |
一、使用OpenExeConfiguration(ConfigurationUserLevel)重載設(shè)置當(dāng)前應(yīng)用程序的配置文件
客戶端應(yīng)用程序使用應(yīng)用于所有用戶的全局配置、應(yīng)用于單個用戶的單獨配置以及應(yīng)用于漫游用戶的配置。userLevel 參數(shù)通過指示該配置文件是不具有用戶級別(配置文件與應(yīng)用程序位于同一目錄中),還是具有一個依每個用戶而定的用戶級別(配置文件位于用戶級別所確定的應(yīng)用程序設(shè)置路徑中),從而確定所打開的配置文件的位置。
通過向?userLevel 傳遞下列值之一來指定要獲取的配置:
若要獲取應(yīng)用于所有用戶的?Configuration?對象,請將?userLevel 設(shè)置為 None。
若要獲取應(yīng)用于當(dāng)前用戶的本地?Configuration?對象,請將?userLevel 設(shè)置為 PerUserRoamingAndLocal。
若要獲取應(yīng)用于當(dāng)前用戶的漫游?Configuration?對象,請將?userLevel 設(shè)置為 PerUserRoaming。
注意:若要獲取資源的?Configuration?對象,您的代碼必須對它從中繼承設(shè)置的所有配置文件具有“讀取”特權(quán)。若要更新配置文件,您的代碼還必須對該配置文件及其所在目錄具有“寫入”特權(quán)。
示例程序:
1、配置文件結(jié)構(gòu)如下:
2、通過程序修改LocalHost1節(jié)點的值
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); //重新加載改變的節(jié)點 ConfigurationManager.RefreshSection("appSettings"); //讀取配置文件的值 string strLocalHost1Value2 = ConfigurationManager.AppSettings["LocalHost1"].ToString();//strLocalHost1Value2="http://127.0.0.1"
二、使用OpenExeConfiguration(String)重載設(shè)置指定的客戶端配置文件
重載指定的客戶端config文件主要包括下面3種情況:
- 1、加載非當(dāng)前應(yīng)用程序yyy.exe默認的config文件的xxx.exe.config文件(yyy.exe是當(dāng)前應(yīng)用程序,xxx.exe.config與yyy.exe.config文件不在同一目錄下)。
- 2、加載非應(yīng)用程序的xxx.config文件。
- 3、讓類庫xxx.dll內(nèi)的函數(shù)讀取默認config文件的時候,讀取的是xxx.dll同級目錄下的xxx.dll.config文件,而不是加載xxx.dll的應(yīng)用程序yyy.exe的默認應(yīng)用程序配置文件:yyy.exe.config。
注意:在類庫中使用ConfigruationManager讀取的不是自動編譯生成的xxx.dll.config文件,而是引用類庫的應(yīng)用程序yyy.exe的yyy.exe.config文件。
解決方法:
按照MSDN上的說明,我們把要打開的xxx.exe.config的路徑作為參數(shù)傳入,代碼如下:
Configuration con = ConfigurationManager.OpenExeConfiguration("C:\\Modify.exe.config"); con.AppSettings.Settings["LocalHost2"].Value = "測試";
但是程序運行的時候報錯,經(jīng)過調(diào)試,發(fā)現(xiàn)con對象的FilePath屬性的值為:C:\Modify.exe.config.config,程序自己在傳入的參數(shù)后增加了“.config”作為要打開的config文件的路徑,因為沒有這個文件,所以程序報錯。這里要傳入的參數(shù),不應(yīng)該是要打開的config文件的路徑,而是這個config文件對應(yīng)的應(yīng)用程序的路徑,上面的代碼應(yīng)修改為:
//參數(shù)傳的是應(yīng)用程序的路徑 Configuration con = ConfigurationManager.OpenExeConfiguration("C:\\Modify.exe."); con.AppSettings.Settings["LocalHost2"].Value = "測試";
再次運行程序,還是報錯,提示“加載配置文件時出錯:參數(shù)exePath”無效。這里要傳入應(yīng)用程序的路徑(exePath)沒錯,但是因為在xxx.exe.config文件的同一目錄下,沒有xxx.exe文件,因此我們傳入的exePath實際上是無效的,為了能夠加載xxx.exe.config文件,需要在同一目錄下增加一個xxx.exe文件。(可以在同一目錄下新建一個txt文件,修改名稱為xxx,擴展名為.exe,這樣就可以加載xxx.exe.config配置文件了)
完整的代碼如下:
//參數(shù)傳的是應(yīng)用程序的路徑 Configuration con = ConfigurationManager.OpenExeConfiguration("C:\\Modify.exe"); con.AppSettings.Settings["LocalHost2"].Value = "測試"; //保存配置文件 con.AppSettings.SectionInformation.ForceSave = true; con.Save(ConfigurationSaveMode.Modified); //重新加載改變的節(jié)點 ConfigurationManager.RefreshSection("appSettings"); //讀取修改后的配置文件節(jié)點值 string str = con.AppSettings.Settings["LocalHost2"].Value;//str="測試"
注意:
使用ConfigurationManager.OpenExeConfiguration(string exePath)即可,同時注意2個小細節(jié):
- A:改方法需傳入的是exePath,而不是configPath;
- B:exePath必須是有效的,因此xxx.exe和xxx.exe.config應(yīng)該成對出現(xiàn),缺一不可。
加載非應(yīng)用程序的xxx.config文件
在上面的例子中,觀察xxx.exe.config文件的名稱,發(fā)現(xiàn),若把xxx.exe看成YYY,則xxx.exe.config=YYY.config,也就是說:xxx.exe.config是xxx.config文件的一種特殊形式,所以,可以使用如下的代碼加載xx.config文件:
//參數(shù)傳的是應(yīng)用程序的路徑 Configuration con = ConfigurationManager.OpenExeConfiguration("C:\\Modify"); con.AppSettings.Settings["LocalHost2"].Value = "測試"; //保存配置文件 con.AppSettings.SectionInformation.ForceSave = true; con.Save(ConfigurationSaveMode.Modified); //重新加載改變的節(jié)點 ConfigurationManager.RefreshSection("appSettings"); //讀取修改后的配置文件節(jié)點值 string str = con.AppSettings.Settings["LocalHost2"].Value;//str="測試"
注意:C:\Modify這個文件必須要有。
加載xxx.dll.config文件:
還是從文件名上來找思路,我們要加載xxx.dll.config文件,可以和加載xxx.config文件一樣。在dll內(nèi),碰到需要讀取config文件信息的時候,放棄使用ConfigurationManager讀取節(jié)點的值,而是使用OpenExeConfiguration(string exePath)方法加載config文件為一個Configuration對象來使用。
注意:通過程序修改配置文件中節(jié)點的值,不會修改.config文件里面的值,更改只是發(fā)生在內(nèi)存中。
原文鏈接:https://www.cnblogs.com/dotnet261010/p/6597177.html
相關(guān)推薦
- 2022-05-20 flume的負載均衡load balancer
- 2022-10-08 C#中32位浮點數(shù)Float(Real)一步步按位Bit進行分析_C#教程
- 2022-08-15 前端如何解決瀏覽器自動填充input輸入框賬號密碼的問題
- 2022-09-15 C語言實現(xiàn)簡單的推箱子小游戲_C 語言
- 2022-12-28 React組件的生命周期深入理解分析_React
- 2022-12-31 一文初探Go語言中的reflect反射包_Golang
- 2022-11-07 C++圖文并茂分析講解模板_C 語言
- 2023-07-24 前端終止請求的三種方式(ajax、axios)
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支