通过COM互操作创建C#对象时正确处理

通过COM互操作创建C#对象时正确处理,c#,vb6,com-interop,dispose,C#,Vb6,Com Interop,Dispose,我正在编写一个C#类库组件,它将充当TCP服务器。它将通过特定端口侦听和接收XML,对其进行反序列化,然后引发包含结果对象的事件作为事件参数 类库本身将由VB6应用程序使用,该应用程序将接收并处理事件和相关COM可见类对象 TcpServer类包装了TcpListener函数,不可见。这将处理连接并引发处理连接、断开连接和接收数据的事件 sealed class TcpServer : IDisposable { private readonly TcpListener tcpListe

我正在编写一个C#类库组件,它将充当TCP服务器。它将通过特定端口侦听和接收XML,对其进行反序列化,然后引发包含结果对象的事件作为事件参数

类库本身将由VB6应用程序使用,该应用程序将接收并处理事件和相关COM可见类对象

TcpServer类包装了TcpListener函数,不可见。这将处理连接并引发处理连接、断开连接和接收数据的事件

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);
    }
}
公共类服务器:IWUServer
{
专用tcp服务器tcp服务器;
公共服务器()
{
tcpServer=新的tcpServer(12345);
tcpServer.DataReceived+=新事件处理程序(tcpServer_DataReceived);
tcpServer.SocketConnected+=新事件处理程序(tcpServer_SocketConnected);
tcpServer.SocketDisconnected+=新事件处理程序(tcpServer_SocketDisconnected);
}
}
我遇到的问题是,VB6应用程序没有正确处理TcpServer类。在应用程序关闭之前将WUServer实例设置为Nothing不会导致TcpServer类的处理,它会继续挂起套接字,如果我再次尝试运行VB6应用程序,则会导致错误

如果我从C#应用程序中使用WUServer类,一切正常,在TcpServer上调用Dispose并关闭套接字


当TcpServer类由VB6应用程序间接创建时,我应该如何确保它被正确地处理

您可以将一个公共方法添加到您在VBA中显式调用的WUServer中 在该方法中,释放您的TCP服务器

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

+1这就是解决办法。Com可调用包装器不注意IDisposable。这里要感谢你们两位,这个链接也非常有用。