2012-11-01 50 views
1

使用VB2008,我需要在需要通信的2臺計算機上安裝2個應用程序。我設置了一個命名管道,到目前爲止,它正在工作。我可以在這兩個程序之間來回發送字符串。如何通過VB.net中的命名管道發送課程

現在,我需要能夠發送一個類或一個對象。我曾經在某個地方看過序列化是要走的路。因此,在客戶端上,我有:

Public Class cTest 

    Dim Var1 As Boolean 
    Dim Var2 As String = "a test" 
    Dim Var3 As New Collections.ArrayList 

    Public Sub AddItem(ByVal Item As String) 
     Var3.Add(Item) 
    End Sub 

End Class 

Private Sub Button8_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button8.Click 

     Dim oClasse As New cTest 

     oClasse.AddItem("StarWars") 
     oClasse.AddItem("StarTrek") 

     oPipe.SendToPipe(oClasse) 
    End Sub 

End Class 

Public Sub SendToPipe(ByVal test As cTest) 

     Dim xmlTest As New Xml.Serialization.XmlSerializer(GetType(cTest)) 
     xmlTest.Serialize(pipeClient, test) 

    End Sub 

在服務器端(在遠程計算機上):

Public Function ReadString() As String 

     Dim len As Integer = 0 
     len = CType(ioStream.ReadByte(), Integer) * 256 
     len += CType(ioStream.ReadByte(), Integer) 

     Try 
      Dim serializer As New Xml.Serialization.XmlSerializer(GetType(cTest)) 
      Dim Test As cTest 

      Test = CType(serializer.Deserialize(ioStream), cTest) 
     Catch ex As Exception 
     End Try 

End Function 

的serializer.Deserialize拋出一個異常,說的XML格式不正確。

我做錯了什麼?

感謝您的時間和幫助

回答

0

如果我是你,我會使用WCF自託管服務,讓使用回調

0

這開始作爲一個評論,但我運行的空間在兩個通信。我不是有名的管道通信方面的專家,但已經過了幾個小時,可能這不是真正的問題。

您需要先在同一應用程序中測試序列化/反序列化。換句話說,先從管道中取出管道。這將隔離這是一個序列化問題還是命名管道問題。假設你的代碼在同一個應用程序中完成時會工作,那麼你需要比較兩個應用程序生成的xml - 讓它們都執行一個Serialize。如果xml是相同的(我懷疑),然後通過管道並再次比較它。

在這裏進一步發展,但您可能會發現ctest對象的名稱空間不同。如果是這種情況,可能有助於在兩個應用程序共享的庫中定義共享類。

1

最後,大量的測試和谷歌搜索後,我想通了:

使用在客戶端它的工作原理如下代碼時:

Dim oClasse As New cTest 

oClasse.AddItem("StarWars") 
oClasse.AddItem("StarTrek") 

Using PStream As IO.Pipes.NamedPipeClientStream = New IO.Pipes.NamedPipeClientStream(".", "VisionEnginePipeRead1", PipeDirection.Out, PipeOptions.None, TokenImpersonationLevel.None) 
      PStream.Connect() 
      Dim xmlTest As New Xml.Serialization.XmlSerializer(GetType(cTest)) 
      xmlTest.Serialize(PStream, oClasse) 
End Using 

而這一點,在服務器端:

Dim Test As cTest 

Using PStream As NamedPipeServerStream = New NamedPipeServerStream(pipeName, PipeDirection.In, 1, PipeTransmissionMode.Byte, PipeOptions.None) 
      PStream.WaitForConnection() 
      Dim serializer As New Xml.Serialization.XmlSerializer(GetType(cTest)) 

      Test = CType(serializer.Deserialize(PStream), cTest) 
End Using