加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C#:从VB6通过COM Interop创建时正确处理C#对象

发布时间:2020-12-15 08:48:11 所属栏目:百科 来源:网络整理
导读:我正在编写一个C#类库组件,它将充当TCP服务器.它将通过特定端口侦听和接收 XML,对其进行反序列化,然后将包含结果对象的事件作为事件参数引发. 类库本身将由VB6应用程序使用,该应用程序将接收和处理事件以及相关的COM可见类对象. TcpServer类包装了TcpListene
我正在编写一个C#类库组件,它将充当TCP服务器.它将通过特定端口侦听和接收 XML,对其进行反序列化,然后将包含结果对象的事件作为事件参数引发.

类库本身将由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并关闭套接字.

在VB6应用程序间接创建TcpServer类时,如何确保正确处理它?

解决方法

您可以向WUServer添加一个公共方法,您可以在VBA中显式调用它
在该方法内部释放您的TCP服务器
void Close()
{
 tcpServer.Dispose();
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读