[英]Properly disposing C# objects when created via COM Interop
我正在編寫一個 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();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.