2010-09-28 6 views
8

यह एक समस्या है जिसका उपयोग मैं .NET 2.0 में सीरियल पोर्ट क्लास के साथ हर समय होता था। यह सुझाव दिया गया था कि .NET 4 में अपग्रेड करने से समस्या ठीक हो जाएगी ... और यह लगभग सभी मामलों में हुई थी।विंडोज 7 पर .NET 4 सीरियल पोर्ट ऑब्जेक्ट डिस्प्ले अपवाद केवल

यदि मैं यूएसबी-टू-सीरियल एडाप्टर के साथ संवाद करने के लिए .NET में निर्मित सीरियल पोर्ट क्लास का उपयोग कर रहा हूं, और पोर्ट खोलने के दौरान एडाप्टर अप्रत्याशित रूप से अनप्लग किया गया है, तो अवसर पर मुझे एक अनचाहे अपवाद मिलता है:

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

फिर से, अधिकांश समय यह ठीक काम करता है। वास्तव में, मैं अपने कंप्यूटर पर भी समस्या का पुनरुत्पादन नहीं कर सकता। यह मेरे एक दोस्त के साथ होता है। क्या इस त्रुटि को फँसाने के लिए कोई रास्ता है?

संपादित करें: मैं स्वयं व्यवहार को पुन: उत्पन्न करने में सक्षम था। मैं अब प्रयोग कर रहा हूं, लेकिन अभी भी इस त्रुटि को एनईटी 4.0 में क्या कारण बनता है।

संपादित करें 2: यह को केवल विंडोज 7 अनप्लग पर हो और XP पर यूएसबी करने वाली सीरियल एडाप्टर प्लग इन खूबसूरती से काम करता है लगता है।

उत्तर

5

ऐसा लगता है कि यह बग माइक्रोसॉफ्ट द्वारा जल्द ही तय नहीं किया जाएगा, और कोई अच्छा कामकाज नहीं है। मैंने इस समस्या पर काम करने के लिए एक साल से अधिक समय व्यतीत किया है।

मेरे लिए समाधान तीसरे पक्ष के घटक का उपयोग करना था। 15+ परीक्षण करने के बाद, मैंने पाया है कि वास्तव में काम करने वाला एकमात्र CommStudio है।

मुक्त एक्सप्रेस संस्करण यहाँ है: http://www.componentsource.com/products/commstudio/downloads.html?rv=42917

4

app.config को

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

निम्नलिखित जोड़ना मेरे लिए काम किया है। Problem with SerialPort

+0

अजीब, मैं इसे काम करने के लिए कभी नहीं मिला। मैंने लंबे समय से माइक्रोसॉफ्ट के अंतर्निहित सीरियल क्लास को छोड़ दिया है, और तीसरे पक्ष के साथ चला गया है। – Brad

+0

पर्याप्त मेला, मुझे नहीं लगता कि कोई भी कोशिश करेगा और बहस करेगा कि यह एक बुरा विकल्प है :) –

1

(मैं जानता हूँ कि यह एक 2 साल पुराने सवाल है, लेकिन ऐसा लगता है कि समस्या अभी भी प्रासंगिक है, इसलिए मैं कुछ कोड मैंने पाया कि मुझे लगता है कि पोस्टिंग कर रहा हूँ उपयोगी हो सकता है।)

मुझे .NET 2.0 VB प्रोजेक्ट में एक ही समस्या थी। अक्सर यूएसबी-टू-सीरियल एडाप्टर को डिस्कनेक्ट करते समय मुझे एक "अनधिकृत एक्सेस अपवाद" प्राप्त होता है जो प्रोग्राम को क्रैश करता है।

मुझे उस परियोजना को अभी तक .NET 4.x पर बंद करने का मौका नहीं मिला है। साथ ही, मैं समझता हूं कि जो अपवाद मैं देख रहा था वह ओपी द्वारा उल्लिखित जैसा नहीं है, लेकिन मुझे लगता है कि अंतर्निहित समस्या एक जैसी हो सकती है, इसलिए मैं एक समाधान साझा करना चाहता हूं।

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

कि पृष्ठ पर नीचे दी कोड से मेरे लिए समस्या हल हो। यहाँ वास्तविक VB.NET वर्ग मैं प्रयोग किया जाता है:

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

मैं भी इस समस्या थी हैं, लेकिन मैं जो एक गलती ईवेंट सक्रिय, जब एडाप्टर अनप्लग है एक .NET पुस्तकालय पाया और उसके बाद यह सामान्य रूप से अलग हो जाता है। जब एडाप्टर वापस प्लग किया जाता है, तो आप किसी भी समय फिर से कनेक्ट कर सकते हैं। पुस्तकालय का नाम ZylSerialPort.NET है।

संबंधित मुद्दे