Ответ 1
Вам понадобится P/Invoke до CheckRemoteDebuggerPresent. Для этого требуется дескриптор целевого процесса, который вы можете получить из Process.Handle.
У меня есть программа, которая Process.Start() другая программа, и она отключает ее через N секунд.
Иногда я выбираю прикреплять отладчик к запущенной программе. В этих случаях я не хочу, чтобы процесс отключился через N секунд.
Я хочу, чтобы хост-программа обнаружила, что отладчик подключен или нет, поэтому он может не закрывать его.
Уточнение: я не ищу, чтобы определить, прикреплен ли отладчик к моему процессу, я ищу, чтобы определить, прикреплен ли отладчик к процессу, который я породил.
Вам понадобится P/Invoke до CheckRemoteDebuggerPresent. Для этого требуется дескриптор целевого процесса, который вы можете получить из Process.Handle.
if(System.Diagnostics.Debugger.IsAttached)
{
// ...
}
var isDebuggerAttached = System.Diagnostics.Debugger.IsAttached;
Process process = ...;
bool isDebuggerAttached;
if (!CheckRemoteDebuggerPresent(process.Handle, out isDebuggerAttached)
{
// handle failure (throw / return / ...)
}
else
{
// use isDebuggerAttached
}
/// <summary>Checks whether a process is being debugged.</summary>
/// <remarks>
/// The "remote" in CheckRemoteDebuggerPresent does not imply that the debugger
/// necessarily resides on a different computer; instead, it indicates that the
/// debugger resides in a separate and parallel process.
/// <para/>
/// Use the IsDebuggerPresent function to detect whether the calling process
/// is running under the debugger.
/// </remarks>
[DllImport("Kernel32.dll", SetLastError=true, ExactSpelling=true)]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool CheckRemoteDebuggerPresent(
SafeHandle hProcess,
[MarshalAs(UnmanagedType.Bool)] ref bool isDebuggerPresent);
Process process = ...;
bool isDebuggerAttached = Dte.Debugger.DebuggedProcesses.Any(
debuggee => debuggee.ProcessID == process.Id);
Я знаю, что это старый, но у меня была такая же проблема, и я понял, что у вас есть указатель на EnvDTE, вы можете проверить, находится ли этот процесс в Dte.Debugger.DebuggedProcesses:
foreach (EnvDTE.Process p in Dte.Debugger.DebuggedProcesses) {
if (p.ProcessID == spawnedProcess.Id) {
// stuff
}
}
Вызов CheckRemoteDebuggerPresent проверяет, действительно ли процесс отлажен отладки, я считаю, что он не будет работать для обнаружения управляемой отладки.
Решение для меня - Debugger.IsAttached, как описано здесь: http://www.fmsinc.com/free/NewTips/NET/NETtip32.asp