Im viết một thành phần thư viện lớp C# sẽ hoạt động như một máy chủ TCP. Nó sẽ lắng nghe và nhận XML thông qua một cổng cụ thể, deserialize nó và sau đó nâng cao các sự kiện chứa đối tượng kết quả như một đối số sự kiện.C#: Xử lý đúng đối tượng C# khi được tạo qua COM Interop từ VB6
Bản thân thư viện lớp sẽ được ứng dụng VB6 tiêu thụ, sẽ nhận và xử lý các sự kiện và liên kết đối tượng lớp hiển thị COM.
Lớp TcpServer kết thúc tốt hơn chức năng TcpListener và không hiển thị COM. Điều này xử lý các kết nối và tăng các sự kiện xử lý các kết nối, ngắt kết nối và nhận dữ liệu.
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 là lớp hiển thị COM mà ứng dụng VB6 tạo và sử dụng. Nó kết thúc tốt đẹp lớp TcpServer và chịu trách nhiệm deserializing bất kỳ dữ liệu nhận được và nâng cao sự kiện thích hợp với các đối số sự kiện liên quan.
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);
}
}
Vấn đề tôi gặp phải là lớp TcpServer không được ứng dụng VB6 xử lý đúng cách. Thiết lập cá thể WUServer thành Không có gì trước khi ứng dụng đóng không dẫn đến việc loại bỏ lớp TcpServer, nó tiếp tục treo vào socket và dẫn đến lỗi nếu tôi thử chạy lại ứng dụng VB6.
Nếu tôi tiêu thụ lớp WUServer từ ứng dụng C#, mọi thứ đều ổn, Vứt bỏ được gọi trên TcpServer và ổ cắm được đóng lại.
Làm cách nào để đảm bảo rằng lớp TcpServer được xử lý đúng khi được tạo gián tiếp bởi ứng dụng VB6?
+1 Đây là giải pháp. Com Callable Wrappers không chú ý đến IDisposable. Dưới đây là một số [giải thích bởi Sam Gentile] (http://radio-weblogs.com/0105852/stories/2002/12/21/comInteropNotFundamentallyFlawedButHard.html) – MarkJ
Nhờ cả hai bạn, liên kết cũng rất hữu ích. – Andrew