Я даже не знаю C #, но, основываясь на своем опыте работы с другими языками программирования, я могу предположить: если приложение падает, это означает, что с ним что-то серьезно не так. Неправильная обработка памяти и т. Д. Было бы странно для любого языка программирования пытаться выполнить деструкторы / разборки / финализаторы / ... в таком случае. Скорее всего, все пошло бы не так;)
Обновление: (забыл попытаться ответить на другие ваши вопросы) снова, не специфично для C #, но обычно нет никакой гарантии, что деструкторы / освобождающие / финализаторы / ... действительно будут вызваны. Причина этого заключается в том, что при выходе из процесса гораздо проще и эффективнее просто «сжать» блок памяти, используемый для этого процесса, чем запускать деструкторы и т. Д. Для очистки памяти.
Я не уверен, как ответить на ваш последний вопрос, не вдаваясь в технические подробности. Существует несколько способов, с помощью которых сборщики мусора могут быть спроектированы и созданы для работы. Самый простой - сборка мусора останавливает текущий процесс и продолжает его, когда он завершен, хотя также возможно (но более сложно) иметь сборщики мусора, которые работают одновременно. с процессами, память которых они собирают.
Возможно, вы захотите прочитать теорию сборки мусора, чтобы лучше понять все это. На самом деле есть целый сайт только на эту тему: www.memorymanagement.org .