2010-09-28 6 views
8

C'est un problème que j'ai toujours eu avec la classe de port série dans .NET 2.0. Il a été suggéré que la mise à niveau vers .NET 4 réglerait le problème ... et cela dans presque tous les cas. Si j'utilise la classe de port série intégrée à .NET pour communiquer avec un adaptateur USB-série et que l'adaptateur est débranché de façon inattendue alors que le port est ouvert, une exception non gérée est parfois générée:Port série .NET 4 ObjectDisposedException sur Windows 7 uniquement

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

Encore une fois, la plupart du temps cela fonctionne très bien. En fait, je ne peux même pas reproduire le problème sur mes propres ordinateurs. Cela arrive à un de mes amis. Est-il possible de piéger cette erreur?

Modifier: J'ai été capable de reproduire le comportement moi-même. J'expérimente maintenant, mais je suis toujours perplexe quant aux causes de cette erreur dans .NET 4.0.

Edit 2: Cela semble que arrive sur Windows 7. débranchant et en branchant l'adaptateur USB-série sur XP fonctionne à merveille.

Répondre

5

Il semble que ce bug ne sera pas corrigé par Microsoft de sitôt, et qu'il n'y a pas de bonne solution. J'ai passé plus d'un an à travailler sur ce problème.

La solution pour moi était d'utiliser un composant tiers. Après avoir testé 15+, j'ai trouvé que le seul qui fonctionne vraiment est CommStudio.

La version express gratuite est ici: http://www.componentsource.com/products/commstudio/downloads.html?rv=42917

4

Ajouter ce qui suit à App.Config

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

a travaillé pour moi. Voir Problem with SerialPort

+0

Étrange, je ne pourrais jamais obtenir que cela fonctionne. J'ai longtemps abandonné la classe Serial intégrée de Microsoft, et je suis parti avec une tierce partie. – Brad

+0

Assez juste, je ne pense pas que quiconque essaierait et argumenter que c'est un mauvais choix :) –

1

(je sais que c'est une question de 2 ans, mais il semble que le problème est toujours d'actualité, donc je poste un code je trouve que je pense pourrait être utile.)

J'ai eu un problème similaire dans un projet .NET 2.0 VB. Souvent, lorsque je déconnecte un adaptateur USB-série, j'obtiens une exception "UnauthorizedAccessException" qui bloque le programme.

Je n'ai pas encore eu la chance de porter ce projet sur .NET 4.x. De plus, je comprends que l'exception que je voyais n'est pas la même que celle mentionnée par le PO, mais je pense que le problème sous-jacent pourrait être le même, alors j'aimerais partager une solution que j'ai trouvée.

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

Le code vers le bas de cette page a résolu le problème pour moi. est ici la classe VB.NET réelle je:

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

J'ai aussi eu ce problème, mais je trouve une bibliothèque .NET qui déclenche un événement Faulted, lorsque l'adaptateur est débranché et après qu'il se déconnecte normalement. Vous pouvez vous reconnecter à tout moment, lorsque l'adaptateur est branché. Le nom de la bibliothèque est ZylSerialPort.NET.