讓ConfigurationManager打開任意的配置文件


VisualStudio的配置文件很好很強大,用來保存數據庫連接字符串或鍵值對都非常方便,只需要通過ConfigurationManager的ConnectionStrings或AppSettings屬性就可以隨時取用。但ConfigurationManager打開的是工程的默認配置文件,而我有時候會有這樣的需求:工程A通過某種方式引用了工程B,A和B都有各自的一些配置,我不想把B的配置寫到A的配置文件里,而是希望B也有自己的配置文件。運行時程序從A啟動,那我怎么樣才能讓ConfigurationManager能正確訪問到B的配置文件呢?

 

翻翻ConfigurationManager的簽名,有一個方法吸引了我的注意:OpenExeConfiguration(string exePath)。看上去我可以把B工程的配置文件路徑作為參數傳遞到這個方法,執行后會返回一個Configuration對象,之后我就可以順利的訪問其中的配置信息了

 

可惜現實是殘酷的,OpenExeConfiguration實在是一個古怪的方法,我發現成功調用需要滿足幾個雷人的條件:

1、參數exePath必須是 *.exe 或 *.config 的格式(可能還有其他格式,但 *.dll 肯定不行)

2、exePath對應的文件必須存在(例如 exePath = "C:/ProjectB.exe",那C盤下必須要有一個名為ProjectB.exe的文件),但實際上這個文件一點用也沒有

3、方法調用后最終打開的配置文件實際上名為 exePath + ".config" (所以 exePath = "C:/ProjectB.exe" 時配置文件就是 C:/ProjectB.exe.config,而 *.config 的配置文件就得叫 *.config.config)

 

可能是微軟工程師另有打算,也可能這個方法不是我想象中這樣用的,總之上述幾個條件真的讓我望而卻步了。要是每次總得在目錄下添加一個空白文本,把名字取好后綴改為.exe,再把實際的配置文件的后綴改為.exe.config。。。這個OpenExeConfiguration恐怕不會讓我更方便,只會讓我更糾結。。

 

ConfigurationManager還有幾個類似的方法,但我不知道怎么用,於是遍尋Google和MSDN。終於發現了真正能解決我問題的方法:OpenMappedExeConfiguration

 

不多說,直接上代碼了:

 

string configPath = ...;

ExeConfigurationFileMap map = new ExeConfigurationFileMap();
map.ExeConfigFilename = configPath;

config = ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.None);


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM