C#: Правильно расположение C# возражает при создании через COM Interop из VB6

Я пишу компонент библиотеки классов C#, который собирается действовать как сервер TCP. Это прислушается и получит XML через определенный порт, десериализует его и затем сгенерирует события, содержащие полученный объект как аргумент события.

Сама библиотека классов будет использована приложением VB6, которое получит и обработает события и связанные видимые объекты класса COM.

Класс TcpServer оборачивает TcpListener functionalty и не 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 создает и использует. Это переносит класс TcpServer и ответственно за десериализацию любых полученных данных и генерирование соответствующего события со связанными аргументами события.

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

Проблема, которую я имею, состоит в том, что от класса TcpServer не избавляется правильно приложение VB6. Установка экземпляра WUServer ни к Чему перед завершениями приложения не приводит к избавлению от класса TcpServer, это продолжает держаться за сокет и результаты по ошибкам, если я делаю попытку выполнения приложение VB6 снова.

Если я использую класс WUServer из приложения C#, все прекрасно, Расположите, обращен, TcpServer и сокет закрываются.

Как я должен удостовериться, что от класса TcpServer правильно избавляются, когда он создается косвенно приложением VB6?

6
задан Arseny 2 August 2010 в 11:56
поделиться