2012-09-14 48 views
13

我發現這個代碼片斷,但是當我調試它不返回true:有沒有C#等價於IsDebuggerPresent()?

[DllImport("kernel32.dll", CharSet=CharSet.Auto, ExactSpelling=true)] 
internal static extern bool IsDebuggerPresent(); 
+0

你想做什麼? –

+0

'#if debug' ??? – SpaceBison

+0

在調試器中運行時只顯示一些按鈕。 #if調試會做!在C++中,我首選IsDebuggerPresent,因爲它簡單地區分開發人員是否正在查看它(在發佈版或調試版中)。 – noelicus

回答

30

是:

System.Diagnostics.Debugger.IsAttached 
+0

謝謝 - 不能相信我在Google上找不到這個時候! ...希望這個問題和答案將解決這一個;-) – noelicus

+1

很高興幫助,請標記爲正確的,以便其他人可以更容易地找到它 – BugFinder

5

你標記你的問題爲C#所以我假設當說「但是當我正在調試時它不會返回true」,你實際上正在談論託管調試。

IsDebuggerPresent()函數檢查存在的本機調試器。在你的情況下,你應該使用System.Diagnostics.Debugger.IsAttached來檢查(託管)調試器是否存在。

有關調試器API的更多信息,另請參閱this blog post

1

類似於IsDebuggerPresent()最.NET Framework的成員顯然是Debugger.IsAttached,但其內部運作是完全不同的,就像作品從簡單的OutputDebugString非常不同。

  • Debugger.IsAttached請求附加 管理調試器的存在的CLR,並從來沒有困擾以檢查 機調試器的存在。
  • IsDebuggerPresent()詢問內核是否存在附加的本地調試器,並且不管任何託管調試器的知識。

由於Visual Studio的2013年,託管調試器是建立在本機調試的頂部,這樣既IsDebuggerPresent()Debugger.IsAttached調試下VS.託管的應用程序時,應返回true但是,如果您碰巧將Visual Studio附加到託管應用程序並明確將代碼類型覆蓋爲本機,則IsDebuggerPresent()將返回true,而Debugger.IsAttached仍然返回false。

最後,這一切都歸結於你正在努力實現的目標。

相關問題