Исключение ObjectDisposedException последовательного порта .NET 4 только для Windows 7 - PullRequest
8 голосов
/ 28 сентября 2010

Это проблема, с которой я постоянно сталкивался в классе последовательного порта в .NET 2.0. Было предложено, чтобы обновление до .NET 4 решило проблему ... и это произошло почти во всех случаях.

Если я использую встроенный в .NET класс последовательного порта для связи с адаптером USB-последовательный порт, и адаптер неожиданно отключается при открытом порту, иногда я получаю необработанное исключение:

Application: test.exe
Framework Version: v4.0.30319
Description: The process was terminated due to an unhandled exception.
Exception Info: System.ObjectDisposedException
Stack:
   at System.Runtime.InteropServices.SafeHandle.DangerousAddRef(Boolean ByRef)
   at System.StubHelpers.StubHelpers.SafeHandleAddRef(System.Runtime.InteropServices.SafeHandle, Boolean ByRef)
   at Microsoft.Win32.UnsafeNativeMethods.GetOverlappedResult(Microsoft.Win32.SafeHandles.SafeFileHandle, System.Threading.NativeOverlapped*, Int32 ByRef, Boolean)
   at System.IO.Ports.SerialStream+EventLoopRunner.WaitForCommEvent()
   at System.Threading.ThreadHelper.ThreadStart_Context(System.Object)
   at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
   at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object)
   at System.Threading.ThreadHelper.ThreadStart()

Опять же, в большинстве случаев все работает нормально. На самом деле, я даже не могу воспроизвести проблему на своих компьютерах. Это происходит с моим другом. Можно ли вообще как-то отловить эту ошибку?

Редактировать: Мне удалось воспроизвести поведение самостоятельно. Сейчас я экспериментирую, но все еще не могу понять, что вызывает эту ошибку в .NET 4.0.

Редактировать 2: Кажется, что только происходит в Windows 7. Отключение и подключение адаптера USB-to-serial в XP прекрасно работает.

Ответы [ 4 ]

5 голосов
/ 04 ноября 2011

Похоже, что эта ошибка не будет исправлена ​​Microsoft в ближайшее время, и что нет хорошего обходного пути.Я потратил больше года на то, чтобы время от времени работать над этой проблемой.

Решением для меня было использование стороннего компонента.После тестирования 15+ я обнаружил, что единственное, что действительно работает, это CommStudio.

Бесплатная экспресс-версия здесь: http://www.componentsource.com/products/commstudio/downloads.html?rv=42917

4 голосов
/ 31 января 2011

Добавление следующего в app.config

<runtime>
 <legacyUnhandledExceptionPolicy enabled="1"/>
</runtime>

сработало для меня. См. Проблема с SerialPort

2 голосов
/ 08 мая 2013

(я знаю, что это вопрос 2-х летнего возраста, но похоже, что проблема все еще актуальна, поэтому я публикую некоторый код, который, как мне кажется, может быть полезен.)

У меня быланалогичная проблема в проекте .NET 2.0 VB.Часто при отключении адаптера USB-to-serial я получал «UnauthorizedAccessException», который вызывал сбой программы.

У меня еще не было возможности перенести этот проект на .NET 4.x.Кроме того, я понимаю, что исключение, которое я вижу, не совпадает с упомянутым в ОП, но я думаю, что основная проблема может быть такой же, поэтому я хотел бы поделиться решением, которое я нашел.

http://go4answers.webhost4life.com/Example/unauthorizedaccessexception-6130.aspx

Код внизу страницы решил проблему для меня.Вот фактический класс VB.NET, который я использовал: m

Option Explicit On
Option Strict Off           ' so we can use late binding (1)

Imports System.IO.Ports

''' <summary>
''' This is a drop-in replacement for .net built-in SerialPort class.
''' It avoids "UnauthorizedAccessException" errors that sometimes happen
''' when disconnecting and reconnecting USB-to-serial adapters.
''' </summary>
''' <remarks>http://go4answers.webhost4life.com/Example/unauthorizedaccessexception-6130.aspx</remarks>

Public Class ExSerialPort

    Inherits SerialPort

    Public Sub New()
        MyBase.New()
    End Sub

    Protected Overrides Sub Dispose(ByVal disposing As Boolean)
        Dim mytype As Type = GetType(SerialPort)
        Dim field As Reflection.FieldInfo = mytype.GetField("internalSerialStream", Reflection.BindingFlags.Instance Or Reflection.BindingFlags.NonPublic)
        Dim stream As Object = field.GetValue(Me)

        If Not stream Is Nothing Then
            Try
                stream.Dispose()   ' (1)
            Catch ex As Exception
                ' do nothing
            End Try
        End If
        MyBase.Dispose(disposing)
    End Sub

End Class
1 голос
/ 12 мая 2016

У меня тоже была эта проблема, но я нашел библиотеку .NET, которая запускает событие Faults, когда адаптер отключен и после этого он нормально отключается. Вы можете подключиться в любое время, когда адаптер снова подключен. Название библиотеки - ZylSerialPort.NET.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...