У меня были те же проблемы с .NET 2.0, и я вернулся к использованию оболочки FTDI dll:
http://www.ftdichip.com/Support/SoftwareExamples/CodeExamples/CSharp/FTD2XX_NET_1010.zip
Работает очень хорошо, и у вас есть доступ к управлению настоящими вкусностями драйвера, такими как программная установка таймера задержки.
Я написал свой собственный класс для обнаружения событий отключения, перехватывая событие FT_IO_ERROR при попытке прочитать данные. Это не совсем удовлетворительно: поймать ошибку и заявить, что это отключение. Но это работает.
Я говорил об этом с FTDI, и недавно они выпустили новую заметку о применении:
http://ftdichip.com/Support/Documents/AppNotes/AN_152_Detecting_USB_%20Device_Insertion_and_Removal.pdf
При этом используется событие WM_DEVICECHANGE для обнаружения отсоединения USB. Также работает, но есть небольшой улов. Поскольку это сообщение окна, оно работает только в том случае, если у вас есть графический интерфейс, и в некоторых случаях событие не поступит в ваше приложение, если другое приложение работает и перехватывает событие, прежде чем вы сможете его обработать.
Последний вариант - использовать WMI для обнаружения. Вы можете использовать ManagementEventWatcher
создать слушателя на создание и удаление. Это также работает, однако на моем ноутбуке было несколько USB-портов, где драйвер FTDI не возвращал правильный COM-порт и идентификатор местоположения (на самом деле, вообще ничего), и это информация, которую я мог прочитать из WMI, поэтому я не смог связать событие WMI с подключенным устройством в оболочке DLL.
Я сообщил об этой проблеме в FTDI в июне / июле 2010 года, и предположительно проблемы GetCOMportNumber и Location ID были исправлены в их версии драйвера 2.08.02 (август), но у меня не было времени, чтобы перепроверить это.
Пока что мой опыт с адом USB ...