2012-06-13 4 views
6

Как и где я могу запустить команду, когда приложение закрывается, даже если это отладка?Остановить отладочное событие в C#

Мне нужно выполнить команду в любом выходе, даже если пользователь является разработчиком и нажимает кнопку «остановить отладку» в Visual Studio.

Стараюсь с

Application.ApplicationExit += new EventHandler(this.OnApplicationExit); 

, но он не работает. Может быть, я ошибаюсь или это не событие.

Я использую Winforms, а не в форме Close не может быть событием.

Я использую Visual Studio 2005 Net Framework 2.0 (по требованию клиента), но только для информации.

Может я могу переписать ?:

public static void Exit(); 
+2

мне любопытно - почему бы клиент беспокоили по поводу отладки остановки? –

+0

@ m.edmondson, я тоже. –

+1

@ m.edmondson Я смотрел на это для некоторых веб-тестирования - он должен запускать браузеры во время тестов, а выход из отладчика не запускает оставшуюся часть используемого блока, который очищает. Это немного раздражает, так как вы в конечном итоге открываете большое количество браузеров. –

ответ

11

Проблема в том, функция «остановить отладку» остановит приложение полностью - так не более код внутри этого приложения будет работать.

Ваш единственный способ добиться этого - следить за тем, чтобы процесс отлаживался извне и выполнял код, если он был остановлен.

Согласно [MSDN]:

Stop Debugging завершает процесс отлаживаемой, если программа была запущена из Visual Studio.

Однако вы можете получить то, что хотите, с помощью visual studio add-in.

+0

Я понимаю. +1 для обходного пути. У вас есть какая-либо ссылка, чтобы прочитать о том, что можно сделать в самом приложении, чтобы включить ее в документацию по приложению TD/FD? Благодарю. –

+0

К сожалению, не так, как я никогда раньше не делал ничего подобного - может быть, еще один ответ. –

+0

Что значит «полностью остановить приложение»? Отправка WM_CLOSE в основную форму? Или вызов TerminateProcess? Вы полагаете, что последнее - это то, что происходит, но есть ли у вас какие-либо доказательства, подтверждающие это утверждение? – kol

0

Согласно MSDN: http://msdn.microsoft.com/en-us/library/system.windows.forms.application.applicationexit%28v=vs.80%29.aspx

// Handle the ApplicationExit event to know when the application is exiting. 
Application.ApplicationExit += new EventHandler(this.OnApplicationExit); 

private void OnApplicationExit(object sender, EventArgs e) { 
// When the application is exiting 
} 

Является ли это то, что вы реализовали?

+0

Я не думаю, что это будет выполняться при остановке отладки? –

+0

Да, это я пытался. Но он не работает (работает только с обычным потоком приложения). –

+0

К сожалению, я пропустил вопрос. Он хочет, чтобы он работал, даже если программа остановлена ​​точкой отладки разработчиком. Я не верю, что это будет выполняться при использовании отладки. – Mausimo

1

Попробуйте это:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Windows.Forms; 

namespace Prueba { 
    static class Program { 
     [STAThread] 
     static void Main() { 
      Application.EnableVisualStyles(); 
      Application.SetCompatibleTextRenderingDefault(false); 
      Application.Run(new Form1()); 
      //This is the magic line code :P 
      AppDomain.CurrentDomain.ProcessExit += new EventHandler(CurrentDomain_ProcessExit); 
     } 

     static void CurrentDomain_ProcessExit(object sender, EventArgs e) { 
      MessageBox.Show(""); 
     } 
    } 
} 

Ссылка здесь (Fredrik Мёрк): .NET Console Application Exit Event

+0

Как я могу вызвать из CurrentDomain_ProcessExit элемент управления на моем Form1? –

+0

Хотите запустить форму с этого мероприятия? – batressc

+0

Мне нужно многое изменить, и один из них - это удаление объекта (notifyicon) в Form1 (созданный дизайнером). –

Смежные вопросы