2010-09-28 18 views
8

Este es un problema que solía tener todo el tiempo con la clase de puerto serie en .NET 2.0. Se sugirió que la actualización a .NET 4 solucionaría el problema ... y lo hizo en casi todos los casos..NET 4 Serial Port ObjectDisposedException en Windows 7 solamente

Si utilizo la clase de puerto serie incorporada en .NET para comunicarme con un adaptador de USB a serie, y el adaptador se desenchufa inesperadamente mientras el puerto está abierto, en ocasiones recibo una excepción no controlada:

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() 

De nuevo, la mayoría de las veces funciona bien. De hecho, ni siquiera puedo reproducir el problema en mis propias computadoras. Esto le sucede a un amigo mío. ¿Hay alguna manera de atrapar este error?

Editar: Tuve la oportunidad de reproducir el comportamiento yo. Estoy experimentando ahora, pero todavía estoy perplejo sobre qué causa este error en .NET 4.0.

Edición 2: Esto parece solamente sucede en Windows 7. desenchufar y enchufar el adaptador de USB a serie en XP funciona muy bien.

Respuesta

5

Parece que este error no será reparado por Microsoft en el corto plazo, y que no hay una buena solución. He pasado más de un año trabajando en este problema de forma intermitente.

La solución para mí fue utilizar un componente de terceros. Después de probar 15+, descubrí que el único que realmente funciona es CommStudio.

La versión libre expreso está aquí: http://www.componentsource.com/products/commstudio/downloads.html?rv=42917

4

añadiendo lo siguiente a App.config

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

ha trabajado para mí. Ver Problem with SerialPort

+0

Extraño, nunca podría hacer que eso funcione. Hace tiempo que renuncié a la clase serial incorporada de Microsoft y me he ido con terceros. – Brad

+0

Justo lo suficiente, no creo que nadie intente y argumente que es una mala elección :) –

1

(sé que esto es una cuestión de 2 años de edad, pero parece que el problema sigue siendo relevante, así que les dejo algo de código que encontré que pienso podría ser útil.)

Tuve un problema similar en un proyecto .NET 2.0 VB. A menudo, al desconectar un adaptador de USB a serie, obtengo una "Excepción de acceso no autorizada" que bloqueaba el programa.

No he tenido la oportunidad de llevar ese proyecto a .NET 4.x todavía. Además, entiendo que la excepción que estaba viendo no es la misma que la mencionada por el OP, pero creo que el problema subyacente podría ser el mismo, así que me gustaría compartir una solución que encontré.

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

El código hacia la parte inferior de esa página resuelto el problema para mí. Aquí está la clase VB.NET real utilicé:

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

También tuve este problema, pero me pareció una biblioteca .NET que dispara un evento con fallo, cuando el adaptador esté desconectado y después de que se desconecta normalmente. Puede volver a conectar en cualquier momento, cuando el adaptador está enchufado nuevamente. El nombre de la biblioteca es ZylSerialPort.NET.

Cuestiones relacionadas