2010-04-05 115 views
3

我想要獲取從asp.net中的dll引發的異常的函數名稱。從DLL獲取函數名稱

+1

你的意思是你想獲取拋出異常的方法的名稱? – Elisha 2010-04-05 09:10:11

+0

是的,我需要在DLL中的方法的名稱,拋出異常 – Hari 2010-04-05 09:15:13

回答

0

您應該能夠利用堆棧跟蹤

Exception.StackTrace Property

StackTrace Class

表示一個堆棧跟蹤,它是一個或多個 堆棧幀的 有序集合。

StackFrame Class

甲的StackFrame被創建並上推 調用堆棧一個線程的執行期間由每個函數調用 。 堆棧幀始終包含 MethodBase信息,並且可選地包含文件名稱,行號和 列號信息。

StackFrame信息將最多 信息與調試版本 配置。默認情況下,調試 構建包含調試符號,而 版本構建不包含。調試 符號包含大部分文件, 方法名稱,行號和列 用於構造 StackFrame對象的信息。

0

您可以從例外中創建一個StackTrace類並分析這些幀。

例如:

public void Throw() 
{ 
    throw new MyException(); 
} 

public void CallThrow() 
{ 
    Throw(); 
} 

[Test] 
public void GetThrowingMethodName() 
{ 
    try 
    { 
     CallThrow(); 
     Assert.Fail("Should have thrown"); 
    } 
    catch (MyException e) 
    { 
     MethodBase deepestMethod = new StackTrace(e).GetFrame(0).GetMethod(); 
     string deepestMethodName = deepestMethod.Name; 
     Assert.That(deepestMethodName, Is.EqualTo("Throw")); 
    } 
} 
+0

仍然我不能得到該方法的名稱,告訴我如何從DLL中拋出異常的方法的名稱。 – Hari 2010-04-05 10:07:03

+0

@ram,你得到的結果是什麼?你可以發表一個你是代碼的例子,並調用引發異常的外部程序集嗎? – Elisha 2010-04-05 10:19:14

+0

這裏我的例子的代碼: 空隙測試() { /*異常這裏談到*/ } 公共類方法{ 空隙負載() { 測試(); } } 這裏class name'method'是一個dll文件,即時通訊從方法'test()'得到異常。但是堆棧跟蹤以「load()」的形式返回方法的名稱。我需要獲取方法名稱'test()'。 – Hari 2010-04-05 10:41:05

0

你可以嘗試用system.diagnostic命名空間的幫助這裏的堆棧跟蹤的對象是linqpad測試的源代碼,你可以嘗試一下。

void Main() 
{ 
    try { 
     test(); 
    } 
    catch(Exception ex) { 
     StackTrace st = new StackTrace(); 
     st.GetFrame(1).GetMethod().Name.Dump(); 
    } 
} 

// Define other methods and classes here 


public void test() 
{ 
    throw new NotImplementedException(); 
}