Ответ 1
Да:
System.Diagnostics.Debugger.IsAttached
Я нашел этот фрагмент кода, но он не возвращает true, когда я отлаживаю:
[DllImport("kernel32.dll", CharSet=CharSet.Auto, ExactSpelling=true)]
internal static extern bool IsDebuggerPresent();
Да:
System.Diagnostics.Debugger.IsAttached
Вы отметили свой вопрос как C#
, поэтому я предполагаю, когда говорю "но он не возвращает true, когда я отлаживаю", вы фактически говорите об управляемой отладке.
Функция IsDebuggerPresent()
проверяет наличие собственного отладчика. В вашем случае вы должны использовать System.Diagnostics.Debugger.IsAttached
, чтобы проверить, присутствует ли (управляемый) отладчик.
Также см. этот пост в блоге для получения дополнительной информации об API-интерфейсах отладчика.
Элемент .NET Framework, который напоминает IsDebuggerPresent()
, наиболее очевидно, Debugger.IsAttached
, но их внутренняя работа совсем другая, так же как Debugger.Log
работает совсем не так, как просто OutputDebugString
.
Debugger.IsAttached
запрашивает CLR для наличия прикрепленного
управляемый отладчик, и даже не потрудился проверить наличие
родной отладчик.IsDebuggerPresent()
запрашивает ядро наличие встроенного отладчика и не знает об управляемых отладчиках.Как и в Visual Studio 2013, управляемый отладчик построен поверх встроенного отладчика, поэтому оба IsDebuggerPresent()
и Debugger.IsAttached
должны возвращать true при отладке управляемого приложения в VS. Но если вы подключили Visual Studio к управляемому приложению и явно переопределили тип кода на native, IsDebuggerPresent()
вернет значение true, а Debugger.IsAttached
все равно вернет false.
В конце концов, все сводится к тому, чего вы пытаетесь достичь.