載入非預設的config檔案

2021-05-21 18:11:06 字數 3639 閱讀 9290

** http://www.cnblogs.com/bearhand/archive/2008/09/07/1279087.html 作者 bearhand

一、緣起

最近做專案開始使用c#,因為以前一直使用的是c++,因此物件導向思想方面的知識還是比較全面的,反而是因沒有經過完整、系統的.net方面知識的系統學習,經常被一些在c#老鳥眼裡幾乎是常識的小知識點給絆倒。

為什麼這麼說呢,因為我在網路上查詢的資料的時候,經常大部分問題,都是能夠找到或多或少的參考資料,但是這些小知識點卻很少能夠找到正確的解決方法,有也是只有提問,沒有回到,那麼這種情況出現,就只有2種解釋:

1、這個方面的問題很難,難到沒有人能夠解決;

2、這個問題太簡單,簡單到稍微熟悉的人都不屑於回答,提問者也在一番思考後,輕鬆找到答案。(我比較傾向這個,呵呵,因此我也把這些小知識,叫做:容易被忽略的細節)

然而,無論問題是否簡單,既然我會被絆倒,耽擱時間,肯定也會有人被同樣耽擱,因此我想把這些細節整理出來,還是具有一定意義的。

於是,本系列文章開始...

二、問題描述

除了正常情況下的config檔案,使用configurationmanager載入,我們還可能會碰到一下這樣的情況:

1、載入非當前應用程式yyy.exe預設的config檔案的***.exe.config檔案;(比如:與yyy.exe.config不在同一目錄下 或者 檔名不同)

2、載入非應用程式的***.config檔案;

3、讓類庫***.dll內的函式讀取預設config檔案的時候,讀取的是***.dll同級目錄下的***.dll.config檔案,而不是載入***.dll的應用程式yyy.exe的預設應用程式配置檔案:yyy.exe.config;

以上三種情況,都不能直接使用configurationmanager來載入

三、解決過程

讓我們從最基礎、最簡單、最常見的config檔案的載入來入手,解決上面三個問題:

step1:研究基礎的config檔案載入

openexeconfiguration  已過載。 將指定的客戶端配置檔案作為 configuration 物件開啟。

ok,要找的就是這個,因為這個方法有乙個過載方法是:

openexeconfiguration(string)  將指定的客戶端配置檔案作為 configuration 物件開啟。

step2:載入非當前應用程式預設的config檔案

於是,第乙個問題的解決方案,似乎、應該、可能找到了,按照msdn上的說明,若我們把要開啟的***.exe.config的路徑作為引數傳入即可,**如下:

configuration config = configurationmanager.openexeconfiguration("c://***.exe.config");

dllinfo dllinfo = config.getsection("dllinfo") as dllinfo;

console.writeline(dllinfo);

但是,事情並沒有這麼順利,這樣是無法開啟***.exe.config檔案的,經過除錯,發現:config的屬性filepath的值為:"c://***.exe.config.config",程式自己在傳入的引數後增加了「.config」作為要開啟的config檔案的路徑,這顯然和我們之前從msdn上所看到的不一樣,不用說,我們被微軟小小的耍了一把。這裡要傳入的引數,不應該是要開啟的config的路徑,而應該是這個config檔案對應的應用程式的路徑,也就是說上面的**應該這樣寫:

configuration config = configurationmanager.openexeconfiguration("c://***.exe"); // 寫的是應用程式的路徑

dllinfo dllinfo = config.getsection("dllinfo") as dllinfo;

console.writeline(dllinfo);

再次執行,呵呵,還是不行,提示錯誤:『載入配置檔案時出錯: 引數「exepath」無效。引數名: exepath』。顯然我們有被耍了,這裡要傳入應用程式路徑(exepath)沒錯,但是因為我們並沒有在***.exe.config檔案同目錄下,加入***.exe檔案,因此我們傳入的exepath實際上是無效的,可見為了能夠載入***.exe.config,我們弄乙個***.exe檔案放在一起。

ok,執行,成功。

小結1:第乙個問題的解決方案找到:

使用configurationmanager.openexeconfiguration(string exepath)即可,

同時注意2個小細節:

a:改方法需傳入的是exepath,而不是configpath;

b:exepath必須是有效的,因此***.exe和***.exe.config應該成對出現,缺一不可。

step3:擴充套件step2的戰果,找到載入***.config的方法

step2已經找到了載入***.exe.config的方法,觀察***.exe.config的名稱,發現,若把***.exe看成yyy,顯然***.exe.config = yyy.config,也就是說:***.exe.config是***.config中比較特殊的一種,他要求config檔案的檔名最後4個字母必須是「.exe」。

此時,大膽推測,使用configurationmanager.openexeconfiguration(string exepath),應該可以解決問題。

configuration config = configurationmanager.openexeconfiguration("c://***"); // 記得要有***檔案,否則這個路徑就是無效的了。

dllinfo dllinfo = config.getsection("dllinfo") as dllinfo;

console.writeline(dllinfo);

執行,hoho,成功了。

小結2:第二個問題和第乙個問題的解決方案一樣。

step4:擴充套件***.config解決問題3

繼續擴大戰果,還是從檔名上來找思路,我們要載入的***.dll.config,其實也是***.config中稍微特殊的一種,顯然也可以和step3那樣處理。

使用openexeconfiguration(string exepath)來解決問題三,在dll內,碰到需要讀取config檔案資訊的時候,放棄使用configurationmanager的函式或屬性直接獲取,而改用openexeconfiguration(string exepath)載入config檔案為乙個configuration物件的對應函式或屬性即可。

小結3:第三個問題同樣可以按照第乙個問題的方案來做。

四、額外的思考

在應用程式yyy.exe中通過configurationmanager可以很方便的讀取到yyy.exe.config檔案中的資訊,但在類庫中使用configruationmanager讀取的卻不是自動編譯生成的***.dll.cofig檔案,而是引用類庫的應用程式yyy.exe的yyy.exe.config檔案。

有沒有什麼辦法,讓類庫中的configurationmanager讀取的也是他預設的***.dll.config檔案呢?

五、附錄:例項**:

proe的config載入順序

系統配置檔案 config 如何設定系統配置檔案 config 就不說了,下面主要說說系統配置檔案 config 的載入順序 在執行pro engineer 軟體進行產品設計時,還必須了解系統配置檔案 config 的分類和載入順序。1.兩種型別的 config 檔案config 檔案包括 conf...

springboot配置檔案及預設的載入優先順序

目錄 springboot 配置檔案型別 1.properties 2.yaml springboot 配置檔案預設讀取優先順序 根據配置檔案位置與字尾 1.不同位置的配置檔案讀取優先順序 2.相同位置下的不同檔案型別的讀取優先順序 springboot 特殊的配置檔案讀取方式 1.profiles...

flask 中的配置config檔案

sqlalchemy database uri mysql pymysql 動態追蹤資料庫的修改.sqlalchemy track modifications false 會列印原生sql語句,便於觀察測試 sqlalchemy echo true 會列印原生sql語句,便於觀察測試 在flask專...