通过COM互操作创建C#对象时正确处理
我正在编写一个C#类库组件,它将充当TCP服务器。它将通过特定端口侦听和接收XML,对其进行反序列化,然后引发包含结果对象的事件作为事件参数 类库本身将由VB6应用程序使用,该应用程序将接收并处理事件和相关COM可见类对象 TcpServer类包装了TcpListener函数,不可见。这将处理连接并引发处理连接、断开连接和接收数据的事件通过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
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。这里要感谢你们两位,这个链接也非常有用。