Без дополнительной информации о вашей конкретной среде, включая конфигурацию машины и информацию о реестре, невозможно точно ответить. Но, скорее всего, (неудовлетворительный) ответ заключается в том, что GetPortNames()
просто делает все возможное, имея доступную ему информацию.
I.e. он проверяет реестр, чтобы увидеть, какие порты существуют, и возвращает их список. В некоторых случаях один и тот же номер COM-порта может быть повторно использован несколькими устройствами или даже несколькими способами использования одного и того же устройства (в зависимости от драйвера), в результате чего номер порта будет указан в реестре более одного раза.
Действительно, в некоторых случаях вы можете вернуть имя COM-порта, которое на данный момент недействительно. То есть некоторое устройство, которое действительно существовало в какой-то момент, но которое было удалено/отключено/и т. д. и больше не используется.
Это классический вопрос «вывоз, вывоз мусора».
Для соответствующей информации по этому вопросу, вы хотели бы проверить эти переполнение стека вопросы:
GetPortNames() returns stale data/Remove stale comport entries in Windows?
SerialPort.GetPortNames() is wrong
SerialPort.GetPortNames() behavior
Этот метод извлекает имена из реестра. Возможно, это неверные данные. [GetPortNames] (https://msdn.microsoft.com/en-us/library/system.io.ports.serialport.getportnames (v = vs.110) .aspx) – endofzero
Спасибо за редактирование @MethodMan –