2010-08-02 19 views
6

TCP sunucusu gibi davranacak bir C# sınıfı kitaplık bileşeni yazıyorum. Belirli bir port üzerinden XML dinleyecek ve alacaktır, onu seri hale getirecek ve daha sonra ortaya çıkan nesneyi bir olay argümanı olarak içeren olayları arttıracaktır.C#: COM Interop ile oluşturulduğunda C# nesnesini düzgün bir şekilde VB6'dan ayırma

Sınıf kütüphanesinin kendisi, olayları ve ilişkili COM görünür sınıfı nesnelerini alan ve işleyen bir VB6 uygulaması tarafından tüketilecektir.

TcpServer sınıfı TcpListener işlevini sarar ve COM görünür değil. Bu bağlantıları ele alır ve bağlar, bağlantı kesilmesi ve alınan verilerle ilgili olayları gündeme getirir.

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, VB6 uygulamasının oluşturduğu ve kullandığı COM görünür sınıfıdır. TcpServer sınıfını sarar ve alınan tüm verilerin serileştirilmesinden ve ilgili olayı ilgili olay argümanlarıyla yükseltmekten sorumludur.

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

I 'e sahip am sorun TcpServer sınıfı VB6 uygulaması ile uygun şekilde bertaraf edilir edilmez olmasıdır. Uygulama kapatılmadan önce WUServer örneğinin Nothing olarak ayarlanması, TcpServer sınıfının elden çıkarılmasıyla sonuçlanmaz, yuvaya asmaya devam eder ve VB6 uygulamasını yeniden çalıştırmayı denediğimde hatalarla sonuçlanır.

WUServer sınıfını bir C# uygulamasından kullanırsam, her şey yolundaysa, TcpServer'da Dispose çağrılır ve yuva kapatılır.

TcpServer sınıfının, VB6 uygulaması tarafından dolaylı olarak oluşturulduğunda düzgün şekilde atıldığından nasıl emin olmalıyım?

cevap

8

Eğer bu yöntemin iç VBA açıkça çağrı WUServer için genel bir yöntem ekleyebilir TCP sunucu

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

+1 Bu çözümdür bırakın. Com Callable Wrappers, IDisposable'a herhangi bir ilgi göstermez. İşte bazı [Sam Gentile tarafından açıklama] (http://radio-weblogs.com/0105852/stories/2002/12/21/comInteropNotFundamentallyFlawedButHard.html) – MarkJ

+0

İkiniz sayesinde, bağlantı da çok yardımcı oldu. – Andrew

İlgili konular