我正在编写一个C#类库组件,它将充当TCP服务器。它将通过特定端口监听和接收XML,对其进行反序列化,然后引发包含所得到的对象作为事件参数的事件。
该类库本身将被VB6应用程序使用,该应用程序将接收和处理事件和相关的COM可见类对象。
TcpServer类封装了TcpListener功能,不可用于COM。这处理连接并引发与连接、断开和接收数据有关的事件。
我遇到的问题是,VB6应用程序没有正确地处理TcpServer类的释放。在应用程序关闭之前将WUServer实例设置为Nothing并不能导致TcpServer类被释放,它继续占用套接字,并且如果我尝试再次运行VB6应用程序,则会导致错误。
如果我从C#应用程序中使用WUServer类,一切都很好,TcpServer上调用Dispose并且套接字被关闭。
我应该如何确保当TcpServer类由VB6应用程序间接创建时,它被正确地释放?
该类库本身将被VB6应用程序使用,该应用程序将接收和处理事件和相关的COM可见类对象。
TcpServer类封装了TcpListener功能,不可用于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是VB6应用程序创建和使用的COM可见类。它封装了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);
}
}
我遇到的问题是,VB6应用程序没有正确地处理TcpServer类的释放。在应用程序关闭之前将WUServer实例设置为Nothing并不能导致TcpServer类被释放,它继续占用套接字,并且如果我尝试再次运行VB6应用程序,则会导致错误。
如果我从C#应用程序中使用WUServer类,一切都很好,TcpServer上调用Dispose并且套接字被关闭。
我应该如何确保当TcpServer类由VB6应用程序间接创建时,它被正确地释放?