Вздох, это давняя проблема с эмуляторами последовательного порта USB.Последовательные порты - это устройства, которые датируются каменным веком.Раньше их вкручивали в шину, и их нельзя было убрать, пока программа использовала их, не создавая искр и вздымающегося дыма.Каменный век также включает в себя отсутствие какой-либо поддержки plug-and-play, чтобы программа могла обнаружить, что устройство внезапно превратилось в гонзо.
К сожалению, большинство драйверов устройств, которые имитируют их, просто делают ихисчезнуть, даже если программа открыла порт.Это работает примерно так же, как и извлечение флэш-накопителя из гнезда, когда Windows записывает на него файлы.Существует фоновый рабочий поток, который ожидает уведомлений от драйвера устройства, чтобы он мог генерировать события DataReceived, ErrorReceived и PinChanged.Этот поток переносит сердечный приступ, когда устройство внезапно исчезает.Вы не можете поймать это, это поток, который был запущен классом SerialPort, вы не можете обернуть его с помощью try / catch.
По многочисленным просьбам Microsoft что-то сделала с этим в .NET 4.0.Не совсем уверен, что происходит в этом выпуске.Если вы застряли в более раннем выпуске, единственное разумное, что вы можете сделать, это прикрепить знак рядом со слотом USB: «Не удаляйте во время использования!»Что неизбежно заставляет кого-то отключить устройство, по крайней мере, дважды, чтобы увидеть, что происходит.После чего им это надоедает, и вы оставляете вас в покое.
Весьма необоснованный обходной путь - файл app.exe.config с таким содержанием:
<?xml version ="1.0"?>
<configuration>
<runtime>
<legacyUnhandledExceptionPolicy enabled="1"/>
</runtime>
</configuration>
Не используйте его