2010年8月9日 星期一

取得程式碼所在位置的方法(Method)資訊or呼叫來源方法

在Debug的時候會將錯誤訊息寫入log檔,或是用messageBox跳出錯誤題示
有些時候會希望得知,這些錯誤訊息是在什麼Method中被呼叫的
又或者希望得知,發生錯誤訊息所在的Method,又是被哪個Method所呼叫

System.Reflection.MethodBase類別,就是用來存放Method資訊的
其中MethodBase.Name就可以取得方法名稱

使用System.Reflection.MethodBase.GetCurrentMethod();
可以取得目前程式碼所在的Method

System.Diagnostics.StackTrace類別,顧名思義就是用來追蹤堆疊的
使用StackTrace.GetFrame(0).GetMethod();
可以取得目前程式碼所在的Method
使用StackTrace.GetFrame(1).GetMethod();
可以取得目前程式碼所在的Method的上一層Method
使用StackTrace.GetFrame(2).GetMethod();
可以取得目前程式碼所在的Method的上一層Method的上一層Method.... 以此類推

ps. 使用StackTrace前必須先建立物件
ex: System.Diagnostics.StackTrace st = new System.Diagnostics.StackTrace();
st.GetFrames(1).GetMethod();

2010年8月4日 星期三

當非正常關閉程式時(如:登出或關機),讓程式完成最後的動作(如:釋放資源或資料回存)

有時候使用者並不會以標準的程序來結束程式
如直接按下電源鈕或按下開始->電腦關機來結束windows系統
或者是使用工作管理員來結束程式

此時,我們希望在程式結束前能執行一些必要的程式碼,例如釋放資源或儲存設定之類的
這時就可以使用下面兩個事件來處理,將這些必要的程式碼放在事件處理函式內

當使用者登出或結束windows時,可以使用SystemEvents.SessionEnding 事件來處理
Namespace為 Microsoft.Win32

當使用者使用工作管理員來結束程式時,可以使用Application.ThreadExit 事件來處理
Namespace為 System.Windows.Form