2010-08-02 35 views
6

Im viết một thành phần thư viện lớp C# sẽ hoạt động như một máy chủ TCP. Nó sẽ lắng nghe và nhận XML thông qua một cổng cụ thể, deserialize nó và sau đó nâng cao các sự kiện chứa đối tượng kết quả như một đối số sự kiện.C#: Xử lý đúng đối tượng C# khi được tạo qua COM Interop từ VB6

Bản thân thư viện lớp sẽ được ứng dụng VB6 tiêu thụ, sẽ nhận và xử lý các sự kiện và liên kết đối tượng lớp hiển thị COM.

Lớp TcpServer kết thúc tốt hơn chức năng TcpListener và không hiển thị COM. Điều này xử lý các kết nối và tăng các sự kiện xử lý các kết nối, ngắt kết nối và nhận dữ liệu.

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 là lớp hiển thị COM mà ứng dụng VB6 tạo và sử dụng. Nó kết thúc tốt đẹp lớp TcpServer và chịu trách nhiệm deserializing bất kỳ dữ liệu nhận được và nâng cao sự kiện thích hợp với các đối số sự kiện liên quan.

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); 
    } 
} 

Vấn đề tôi gặp phải là lớp TcpServer không được ứng dụng VB6 xử lý đúng cách. Thiết lập cá thể WUServer thành Không có gì trước khi ứng dụng đóng không dẫn đến việc loại bỏ lớp TcpServer, nó tiếp tục treo vào socket và dẫn đến lỗi nếu tôi thử chạy lại ứng dụng VB6.

Nếu tôi tiêu thụ lớp WUServer từ ứng dụng C#, mọi thứ đều ổn, Vứt bỏ được gọi trên TcpServer và ổ cắm được đóng lại.

Làm cách nào để đảm bảo rằng lớp TcpServer được xử lý đúng khi được tạo gián tiếp bởi ứng dụng VB6?

Trả lời

8

bạn có thể thêm một phương pháp nào để WUServer mà bạn gọi một cách rõ ràng trong VBA bên trong của phương pháp mà phát hành máy chủ TCP của bạn

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

+1 Đây là giải pháp. Com Callable Wrappers không chú ý đến IDisposable. Dưới đây là một số [giải thích bởi Sam Gentile] (http://radio-weblogs.com/0105852/stories/2002/12/21/comInteropNotFundamentallyFlawedButHard.html) – MarkJ

+0

Nhờ cả hai bạn, liên kết cũng rất hữu ích. – Andrew

Các vấn đề liên quan