代码之家  ›  专栏  ›  技术社区  ›  Brad

仅在Windows 7上.NET 4串行端口ObjectDisposedException

  •  8
  • Brad  · 技术社区  · 14 年前

    这是我在.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上。拔下并插入XP上的USB-to-serial适配器工作得很好。

    4 回复  |  直到 14 年前
        1
  •  5
  •   Brad    13 年前

    微软似乎不会很快解决这个问题,也没有很好的解决方法。我花了一年多的时间在这个问题上断断续续地工作。

    我的解决方案是使用第三方组件。在测试了15+之后,我发现唯一真正有效的是commstudio。

    免费的Express版本如下: http://www.componentsource.com/products/commstudio/downloads.html?rv=42917

        2
  •  4
  •   Community Michael Schmitz    7 年前

    将以下内容添加到app.config

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

    为我工作。见 Problem with SerialPort

        3
  •  2
  •   Visual Vincent    6 年前

    (我知道这是一个2年前的问题,但看起来问题仍然是相关的,所以我发布了一些代码,我发现这些代码可能有用。)

    我在.NET 2.0 VB项目中遇到了类似的问题。通常,当断开USB到串行适配器的连接时,我会得到一个“未授权的访问异常”,使程序崩溃。

    我还没有机会将该项目移植到.NET 4.x。另外,我知道我看到的异常和OP提到的不一样,但是我认为潜在的问题可能是相同的,所以我想分享我发现的解决方案。

    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
    
        4
  •  1
  •   Zilord    8 年前

    我也遇到了这个问题,但我发现了一个.NET库,它在适配器拔出后,会触发一个错误事件,然后它会正常断开连接。当适配器插回电源时,您可以随时重新连接。 库的名称是zylserialport.net。