2012-12-04 32 views
0

這個問題在以前問的問題跟進:link.NET編寫Windows服務消耗的VB6應用

我要開發一個Windows服務在.NET/C#。該服務必須由VB6編寫的應用程序使用。該服務實現Quartz.NET來處理預定任務,並且必須實現偵聽器才能啓動由VB6應用程序啓動的函數。

對VB6團隊的要求是能夠使用Winsock。爲此,我必須使用套接字和偵聽器。問題是我沒有這方面的經驗,我更像是一個WCF傢伙。

我正在查看TcpListener類,看看是否符合要求。

我的第一個問題:如果我實現了TcpListener類,記住使用VB6的簡短事件(如數據結構和二進制格式化),VB6團隊是否能夠使用該服務?

我的第二個問題:假設3個函數必須可用於VB6應用程序,並創建了1個偵聽器。什麼是實施這個的最佳實踐?

再一次:任何意見非常感謝!

+3

對於編寫VB6應用程序的人來說,這確實是一個問題,但是......我會說最簡單的方法是使用使用CRLF終止符或類似的ASCII編碼文本數據編寫它。這應該很容易從VB和.NET工作。 –

+0

您可以在.NET端使用HttpListener http://msdn.microsoft.com/en-us/library/system.net.httplistener.aspx,在VB6端使用一些HTTP庫(例如MSXML2.ServerXMLHTTP)。 HTTP比套接字高,但庫更容易處理。 –

+2

爲什麼不通過COM對象公開服務?這對VB6來說很自然。讓服務實現自託管的WCF服務,並將客戶端(「添加服務引用」)作爲COM對象公開。 –

回答

1

將有效載荷作爲XML,文本鍵/值對,JSON或其他鬆散的序列化格式傳遞,可以幫助您確定未來的協議。這允許您使用甚至將新的可選方法參數隨意添加到服務器端。

除了「方法」字段,您可以有一個「協議版本」字段。當發生重大更改(新的必需參數,現有參數類型的更改等)時,您可以使用版本號在過渡期內處理舊客戶和新客戶 - 這可能跨越多年。只要在TCP流上提供消息幀就可以使用某種類型的簡單EOM分隔符或包含二進制或文本長度前綴的消息頭。

您也可以考慮命名管道。 TransactNamedPipe()很容易從VB6程序調用。這爲您處理消息邊界問題 - 假設您需要RPC樣式的協議而不是異步發送/接收。

或者您可能會一路走下來並使用MSMQ。私人機器隊列不需要廣泛的管理。但即使VB6和.Net都具有出色的MSMQ支持,但大多數開發人員對此知之甚少。