2012年5月25日 星期五

[C#] 隱藏設定檔內容 - 內嵌資源

隱藏設定檔內容 - 內嵌資源

開發專案時,某些系統資訊(如連線字串、系統參數等資訊)會選擇寫在XML檔或是文字檔, 例如我們常常使用的App.config,一來是集中管理,一目瞭然; 另外修改參數也方便。但也造成系統資訊暴露,如果想要隱藏設定檔的內容,可以考慮將設定檔編譯成內嵌資源。

Winform專案的App.config為例。
我在App.config加入以下內容
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <add key="My_Name" value="JB" />
  </appSettings>
</configuration>


(A) 直接讀取
使用System.Configuration.ConfigurationManager 可以很快的將我們的系統參數讀取出來。
PS. 需先加入參考System.configuration


/***************************************
* 直接讀取 
***************************************/
String sName = System.Configuration.ConfigurationManager.AppSettings["My_Name"].ToString();
MessageBox.Show(sName);


結果:


(B) 接下是使用內嵌資源的方法
Step1.
先到專案建置輸出的資料夾(\bin\Debug)下,如果已經有App.config的話,請先刪除它。

Step2.
選取App.config,設定他的屬性:【建置動作】為內嵌資源
當然【複製到輸出目錄】仍然選擇預設:不要複製

Step3.
此時,我們無法使用System.Configuration.ConfigurationManager來讀值了。
而是改用System.Reflection.Assembly來把編譯為內嵌資源的App.config裡面的內容讀出來。



/**************************************** 
* 將App.config設成內嵌資源 
****************************************/
System.Reflection.Assembly thisExe;
thisExe = System.Reflection.Assembly.GetExecutingAssembly();

//取得內嵌資源 ...PS:參數是 專案名稱(namespace).檔案名稱 
System.IO.Stream file = thisExe.GetManifestResourceStream("WinForm_Exp.App.config");

//讀取二進位檔.. 
String sXML = "";
using (System.IO.StreamReader sr = new System.IO.StreamReader(file, Encoding.Default))
{
   sXML = sr.ReadToEnd();
}
MessageBox.Show(sXML);




PS.注意sXMLApp.config裡面所有的內容,所以我們後續還要寫一段把XML parsing出來的程式碼,在此就不加累述~

結果:



1 則留言:

  1. 今天遇到...如果內嵌資源的檔案不是放在根目錄。
    Stream file = thisExe.GetManifestResourceStream("專案名稱.檔案名稱");
    這邊的"專案名稱.檔案名稱"就必須加上資料夾的名稱。
    例如: "專案名稱.XXX.YYY.檔案名稱"

    否則就會讀不到檔案內容 ~_~

    回覆刪除