2008-10-30 44 views
2

我想編寫一個Visual Studio宏或類似的東西,它可以獲取函數名稱並插入錯誤報告部分中的預設位置。它更清晰,如果你看看例子PreBuild中插入函數名稱

Class SampleClass 
{ 
    public void FunctionA() 
    { 
     try 
     { 
       //Do some work here 
     } 
     catch (Exception ex) 
     { 
       Logger.WriteLine(LogLevelEnum.Error, "SampleClass", "FunctionA Failed"); 
       Logger.WriteLine(LogLevelEnum.Error, "FunctionA", ex.ToString()); 
     } 
     finally 
     { 
     } 
    } 
} 

所以,我遵循了我的共同庫的大多數關鍵功能的類似模式。我希望能夠在預建期間將「FunctionA」插入日誌記錄部分,這樣我就不必記住在複製和粘貼後輸入正確的名稱或忘記重命名它。可以從工具欄手動調用或通過快捷鍵。

那麼,我應該從哪裏開始?

注意: 我在.Net中被認爲是中級,已經在C#和VB中寫了3年多了,但是我對宏很新,不介意學習。 不要擔心代碼本身和異常,這只是一個例子。編輯: 感謝Ovidiu Pacurar和cfeduke。我在這裏想要的是改變和忘記的一種方式。即使不拋出異常,PostSharp也會在每個函數上產生開銷。從堆棧跟蹤挖掘是可行的,但在某些時候,我還想僅僅記錄「FunctionA Failed」而不花費太多處理來獲取堆棧跟蹤。此外,如果庫被混淆,堆棧跟蹤將是神祕的。

實際上還有一個需要這個功能,我忘了提前。當庫準備交付時,我想通過引用一個表將所有函數名改爲函數代碼,「FunctionA」可能是「0001」,以解決「混淆」日誌問題。

回答

1

看看System.Diagnostics.StackTrace,然後您可以創建一個日誌調用從堆棧獲取函數。

0

看看PostSharp。它可以讓你以非常簡單的方式做到這一點。

有樣品也登錄。

1

我希望C#有__FILE____LINE__-like宏,但它不。但是,您可以使用PostSharp後編譯進程C#。這樣做的好處是無需調用堆棧跟蹤的開銷即可在運行時獲取方法名稱。性能開銷可能不是您在異常處理程序期間擔心的事情,但在任何情況下,PostSharp都是另一個可用於執行此作業的工具。

PostSharp的示例視頻與您正在嘗試做的事情類似。看看PostSharp網站首頁的示例代碼,讓您的齒輪轉向:

public class SimplestTraceAttribute : OnMethodBoundaryAspect 
{ 
    public override void OnEntry(MethodExecutionEventArgs eventArgs) 
    { 
    Trace.TraceInformation("Entering {0}.", eventArgs.Method); 
    Trace.Indent(); 
    } 
    public override void OnExit(MethodExecutionEventArgs eventArgs) 
    { 
    Trace.Unindent(); 
    Trace.TraceInformation("Leaving {0}.", eventArgs.Method); 
    } 
}