Я нашел этот фрагмент кода, но он не возвращает true, когда я отлаживаю:
[DllImport("kernel32.dll", CharSet=CharSet.Auto, ExactSpelling=true)]
internal static extern bool IsDebuggerPresent();
Я нашел этот фрагмент кода, но он не возвращает 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.
В конце концов, все сводится к тому, чего вы пытаетесь достичь.