c# - 通过 COM Interop 创建时正确处理 C# 对象

标签 c# vb6 com-interop dispose

我正在编写一个用作 TCP 服务器的 C# 类库组件。它将通过特定端口监听和接收 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);
    }
}

我遇到的问题是 TcpServer 类没有被 VB6 应用程序正确处理。在应用程序关闭之前将 WUServer 实例设置为 Nothing 不会导致 TcpServer 类的处理,它会继续卡在套接字上,如果我再次尝试运行 VB6 应用程序会导致错误。

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

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

最佳答案

您可以向 WUServer 添加一个公共(public)方法,您可以在 VBA 中显式调用该方法 在该方法内部释放您的 TCP 服务器

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

关于c# - 通过 COM Interop 创建时正确处理 C# 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3387249/

相关文章:

c# - 比较两列并在相同时增加计数

c# - 如何将存储在字符串中的函数添加到 jquery .click 事件

con 的 VB6 透明度

.net - 通过 .NET 从 VB6 调用 Web 服务失败

c# - 如何创建 SafeArray C#?

c# - 如何在 C# 中跟踪事件的订阅者?

c# - WPF Canvas 中的网格线

vb6 - 旧的 Crystal Report 在 CR 2008 查看器中慢得令人痛苦

c# - COMException (0x800401E3) : Operation unavailable (Exception from HRESULT: 0x800401E3 (MK_E_UNAVAILABLE)) with scheduled task

c# - 为 System.Net.NetworkInformation.Ping 创建 COM 可调用包装器