Я пишу компонент библиотеки классов 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?