2010-08-02 15 views
6

से COM इंटरऑप के माध्यम से बनाए गए सी # ऑब्जेक्ट्स को उचित रूप से निपटाना, मैं एक सी # क्लास लाइब्रेरी घटक लिख रहा हूं जो एक टीसीपी सर्वर के रूप में कार्य करने जा रहा है। यह एक विशिष्ट बंदरगाह के माध्यम से एक्सएमएल को सुन और प्राप्त करेगा, इसे deserialize और फिर घटना परिणाम युक्त घटनाओं को घटना तर्क के रूप में उठाएगा।सी #: VB6

कक्षा पुस्तकालय स्वयं एक वीबी 6 एप्लिकेशन द्वारा उपभोग किया जाएगा जो घटनाओं और संबंधित COM दृश्य वर्ग वस्तुओं को प्राप्त और संभाल लेंगे।

टीसीपीसेवर क्लास टीसीपी लिस्टर फ़ंक्शनल्टी को लपेटता है और COM दिखाई नहीं देता है। यह कनेक्शन को संभालता है और कनेक्ट, डिस्कनेक्ट और डेटा प्राप्त करने से संबंधित घटनाओं को बढ़ाता है।

sealed class TcpServer : IDisposable 
{ 
    private readonly TcpListener tcpListener; 
    private bool disposed = false; 

    public TcpServer(int port) 
    { 
     tcpListener = new TcpListener(IPAddress.Any, port); 
     tcpListener.Start(); 
     tcpListener.BeginAcceptSocket(EndAcceptSocket, tcpListener); 
    } 

    ~TcpServer() 
    { 
     Dispose(false); 
    } 

    // blah blah blah 

    public void Dispose() 
    { 
     Dispose(true); 
    } 

    private void Dispose(bool disposing) 
    { 
     if (this.disposed == false) 
     { 
      if (disposing) 
      { 
       if (tcpListener != null) 
       { 
        tcpListener.Stop(); 
       } 
      } 
      this.disposed = true; 
     } 
    }  
} 

WUServer COM दृश्यमान वर्ग है जो VB6 एप्लिकेशन बनाता है और उपयोग करता है। यह टीसीपी सर्वर वर्ग को लपेटता है और किसी भी प्राप्त डेटा को deserializing और संबंधित घटना तर्क के साथ उचित घटना को बढ़ाने के लिए जिम्मेदार है।

public class WUServer : IWUServer 
{ 
    private TcpServer tcpServer; 

    public WUServer() 
    { 
     tcpServer = new TcpServer(12345); 
     tcpServer.DataReceived += new EventHandler<DataReceivedEventArgs>(tcpServer_DataReceived); 
     tcpServer.SocketConnected += new EventHandler<IPEndPointEventArgs>(tcpServer_SocketConnected); 
     tcpServer.SocketDisconnected += new EventHandler<IPEndPointEventArgs>(tcpServer_SocketDisconnected); 
    } 
} 

मेरी समस्या यह है कि टीसीपी सर्वर कक्षा को वीबी 6 आवेदन द्वारा ठीक से निपटान नहीं किया जा रहा है। एप्लिकेशन बंद होने से पहले कुछ भी करने के लिए WUServer इंस्टेंस को सेट करना परिणामस्वरूप टीसीपीसेवर क्लास का निपटान नहीं होता है, यह सॉकेट पर लटकता रहता है और यदि मैं वीबी 6 एप्लिकेशन को फिर से चलाने का प्रयास करता हूं तो त्रुटियों में परिणाम होता है।

यदि मैं एक सी # आवेदन से WUServer कक्षा का उपभोग करता हूं, तो सब कुछ ठीक है, टीसीपी सर्वर पर निपटान कहा जाता है और सॉकेट बंद हो जाता है।

मुझे यह कैसे सुनिश्चित करना चाहिए कि वीसी 6 एप्लिकेशन द्वारा अप्रत्यक्ष रूप से बनाया जाने पर टीसीपीसेवर क्लास का सही तरीके से निपटान किया जाए?

उत्तर

8

आप WUServer के लिए एक सार्वजनिक विधि है जो आपको लगता है कि विधि के अंदर VBA में स्पष्ट रूप से कहते हैं जोड़ सकते हैं आपके TCP सर्वर

void Close() 
{ 
tcpServer.Dispose(); 
} 
+3

+1 यह समाधान है जारी। कॉम कॉल करने योग्य लपेटें IDisposable पर कोई ध्यान नहीं देते हैं। यहां कुछ है [सैम जेनेटाइल द्वारा स्पष्टीकरण] (http://radio-weblogs.com/0105852/stories/2002/12/21/comInteropNotFundamentallyFlawedButHard.html) – MarkJ

+0

दोनों आप के लिए धन्यवाद, लिंक भी बहुत उपयोगी था। – Andrew