2012-01-06 64 views
12

DebuggerStepThrough屬性允許您跳過某些方法/類/屬性。DebuggerStepThrough可以繼承自動生成的IEnumerable實現嗎?

DebuggerStepThrough being ignored明確指出,c#編譯器不會將此屬性繼承到編譯器生成的IEnumerable<T>實現中。

此類故障的簡單的例子是:

static void Main(string[] args) 
{ 
    var a = SkipMe().ToList(); 
} 

[System.Diagnostics.DebuggerStepThrough] 
static IEnumerable<int> SkipMe() 
{ 
    // comment out line below and the throw will be stepped over. 
    yield return 1; 
    throw new Exception(); 
} 

有沒有辦法讓C#編譯器將DebuggerStepThrough屬性添加到自動生成的類型?

有沒有辦法讓視覺工作室跳過調試到[CompilerGenerated]屬性的任何類型?

-

附錄:一些說明性的截圖

按F5

screen 1

screen 2

的Visual Studio版本後結果:

snip 3

我們缺少的屬性:

the missing attribute

+0

對於那些想知道爲什麼在使用Dapper時我們將其作爲一個源代碼塊進行包含的原因,我想避免在常規使用過程中進入任何Dapper代碼,並且不希望爲該項目添加一個dll到項目中。 – 2012-01-06 00:18:53

+0

我無法理解這個問題。編譯器已經將[DebuggerHidden]屬性應用於迭代器類的方法。片段中的示例沒有意義,調試器總是停在未捕獲的異常上。 SkipMe()方法中的註釋沒有意義,它不會執行throw語句。至少在VS2008中,不能說出你在說什麼版本。 – 2012-01-06 09:32:06

+1

@hans vs 2010 .net 4,迭代器只有編譯器生成,我在反射器中檢查過 – 2012-01-06 10:15:26

回答

3

我不認爲有一種方式來實現你要找的效果。

  • 無法讓C#編譯器將此屬性複製到生成狀態機方法中。
  • 您不能通過將DebuggerStepThrough添加到包含迭代器方法的類來解決此問題。調試器只查看直接父類型而不查看包含嵌套類型的類型。

我能想到的唯一真正的方法就是將所有不想調試的代碼放入單獨的DLL中。然後不要加載該特定DLL的PDB。

+1

那麼還有一種方法......你可以PostSharp或Mono.Cecil在輔助編譯中注入屬性:)但是......這幾乎是我的想法。 – 2012-01-06 00:44:47

+0

@SamSaffron是的。通過某種後IL重寫過程絕對有可能。 – JaredPar 2012-01-06 00:45:20

+0

@SamSaffron還有另外一種方法:實現你自己的枚舉類,在那裏應用屬性,並從SkipMe方法返回一個實例。 – phoog 2012-01-06 01:13:47