2009-07-26 84 views
11

你能告訴我什麼是通過.net 3.5中的NamedPipes發送對象的最佳方法嗎?如何通過.NET 3.5中的NamedPipe發送對象?

+3

你不通過進程內通信發送對象,你給他們的表示,文本或二進制。然後用它們在另一側重新創建對象 – blowdart 2009-07-26 19:08:07

+0

請參閱我的更新答案,以獲取有關將對象序列化爲流的鏈接的鏈接。 – 2009-07-26 19:26:43

+0

這是[有用的文章](http://www.switchonthecode.com/tutorials/dotnet-35-adds-named-pipes-support)。要通過流發送對象,請首先閱讀[這裏](http://www.codeguru.com/Csharp/Csharp/cs_data/streaming/article.php/c4223)和[here](http:// www。 codeguru.com/columns/dotnet/article.php/c6595)。 – 2009-07-26 17:59:13

回答

2

通過序列化你的對象不是send it as a text而在另一側反序列化,或使用WCF命名管道綁定,萊姆斯表明

1

你所尋找的是DataContract屬性。另見:MSDN Using Data Contracts

數據合同是服務和客戶之間的正式協議,抽象描述要交換的數據。也就是說,爲了溝通,客戶和服務不必共享相同的類型,只需要相同的數據合同。數據契約爲每個參數或返回類型精確地定義了要交換的數據序列化(轉換爲XML)。

服務合同:

[ServiceContract] 
public interface IApplicationRegistration 
{ 
    // Sends the application information 
    [OperationContract] 
    bool RegisterApplication(AppInfo appInfo); 
} 

的數據交換:

[DataContract] 
public class AppInfo 
{ 
    private int _processID; 
    private string _processName; 

    [DataMember] 
    public int ProcessID 
    { 
     get { return _processID; } 
     set { _processID = value; } 
    } 

    [DataMember] 
    public string ProcessName 
    { 
     get { return _processName; } 
     set { _processName= value; } 
    } 
} 
3

WCF NetNamedPipes結合是要走的路,你也可以考慮.NET遠程實現這一

1

作爲對原始問題的評論指出,你不發送對象到其他進程。您可以將數據發送到另一個進程,並且可以使用該數據在另一個進程中創建原始對象的代理或傳真,但不能直接發送對象

即使是提供進程間對象傳遞語義的技術,也正是這樣做的。因此,你應該總是使用'​​嘗試執行一個操作,並且捕捉異常,如果它失敗'的操作風格,而不是'確保可以執行操作然後執行'風格。即使對象看起來像處於您的操作的有效狀態,您也正在查看舊數據,因此當您嘗試執行實際操作時可能無效。因爲你不能發送對象,所以你最終會做的是序列化一些數據(使用XmlSerializer或DataContractSerializer,或其他),讀取另一端的數據流,然後創建代表舊的一個新對象。您可能會發現創建一個單獨的對象來表示您希望通過管道發送的數據更容易,而不是實際的對象實時表示。

WCF可以爲你自動處理很多這種東西,但你自己通過管道發送它卻沒有什麼困難。

如果像其他人所建議的那樣使用WCF,請注意您還沒有發送「對象」。你仍然在發送數據,而WCF對此非常明確(這就是爲什麼他們稱之爲DataContractSerializer,而不是ObjectSerializer)。具體來說:

1)對使用DataContract序列化發送的對象執行的任何操作都將在本地執行。 2)如果同一對象被髮送兩次,它不會自動更新它的任何舊版本,並且它們不會有引用相等。就C#而言,您將擁有兩個完全不相關的數據結構。

3)對象的更新只能在本地執行,不會自動更新其他進程的「相同」對象。如果你完全相信你需要跨進程傳遞「對象」,那麼你可以推出自己的(我真正推薦的,即使它更多的工作),也可以使用System.Remoting命名空間。

即使使用System.Remoting,也意識到我上面提到的是實際上的發生,並且設計你的對象和系統時考慮到這一點。你會得到更好的結果。