У вас есть несколько вариантов:
1) Написать корневой структурированный обработчик исключений, который обеспечивает уничтожение значка перед выходом. Это требует некоторых усилий, но вы можете в основном добавить свой собственный обработчик исключенных обработчиков в Windows, который будет вызываться в случае многих форм «бум», который затем позволит вам воспользоваться возможностью последней очистки.
2) Напишите приложение монитора, которое спит на вашем основном процессе, обрабатывает и убивает значок, когда он просыпается (основное приложение умерло). Чтобы этот последний сценарий работал хорошо, вы, скорее всего, захотите, чтобы основной процесс НЕ убивал сам значок - или вы могли бы создать способ сообщить приложению монитора, что он должен выйти без разрушения значка (иметь сон приложения монитора как на дескрипторе процесса, так и на именованном событии - и если его разбудил событие, он просто умирает без очистки после основного приложения).
Итак, нет никакого события, которое я могу захватить, если программа умрет? – Malfist
Нет, событий нет. Это «нормальное» поведение ... каждое приложение, имеющее значок в системном трее, оставляет свой значок позади, когда он выходит аномально. – jrista
Очень маловероятно, что у вас не будет возможности очистить значок. AppDomain.ProcessExit - довольно хорошее событие для прослушивания выхода процесса. Если вы не вызовете Environment.FailFast(), это, вероятно, будет вызвано даже в «катастрофических» обстоятельствах. –