2014-01-09 34 views
4

我看了2 C#應用程序以及它們的優缺點之間關於IPC許多不同的事情,但不覺得我已經達到了一個滿意的答覆卻爲我的使用情況。推薦的分享C#之間的對象的方式處理

我有一個已經存在,將頻繁變化(我想我的工具連接到一個遊戲,它使用與工具創建的調試元素)的對象。結果,我不相信序列化是合適的,因爲我基本上是沒有充分理由地每秒60次序列化/反序列化對象。因此,管道是不可能的(或者我在這裏錯過了什麼?)。

隨着比賽更是團結運行,我僅限於.NET 3.5技術,所以不能使用新.NET4共享內存類。

所以它看起來像.NET遠程是要走的路。這並不理想 - 我不需要網絡支持,我想分享的對象在內存中,沒有真正的理由使用代理和發送消息來改變它。

然而,每個人鏈接到的this tutorial似乎並不好 - 源代碼不能編譯,當我編譯它時崩潰了。本教程本身沒有提及Cache類,這看起來很重要,即使是源代碼,我也看不到它如何適合我的應用程序。有更好的資源嗎?這真的是最好的方法嗎?

最後我留下與C++內插使用創建共享存儲器和移動對象到它的非託管功能。在我放下那個兔子洞之前,我想確認他們真的不是一個更好的方法。

更新 - 一些更多的信息

目前只是嘗試的事情了所以2控制檯應用程序。然而,最後我有一個C#/ Winforms應用程序(這個是.NET 4.0,如果有幫助的話)我將連接到Unity進程(顯然我無法控制)。我有一個由工具和Unity使用的DLL。我將有一個允許工具訪問對象的類(例如,如果我可以使用管道,則可以從Unity中調用該類創建管道,然後從該工具連接到管道)。

對象本身本質上表示一個有限狀態機,其描述從XML文件中加載。從極少量的數據中重新創建對象是可能的。但是,我寧願避免手工編碼使用某種事件/信息系統,以保持同步的對象是關於哪個狀態是活動等

+0

快速問題:這兩個應用程序有什麼問題? (即:目標是從統一編譯的可執行文件,工具是形式EXE等)注意:我可能只是嘗試鉤入代碼到目標應用程序,在這種情況下啓動一個線程,然後我有本地控制和訪問目標的其餘部分...線程可以間隔回報給調用者,但我喜歡。 – 2014-01-09 21:12:55

+0

@感謝所有的答案,我會審查他們,並考慮哪些工作最好。閱讀[this](http://stackoverflow.com/a/6091685/958004)答案我看到有一個共享內存可能不足以列出的原因,這使我回到了一個正方形或2 ... –

+0

@ebyrob你能否詳細說明你的意思/如何去實現代碼的動態綁定?如果我正確理解你的話,那聽起來很不錯。 –

回答

1

我們在談論什麼樣的數據約在這裏的解決方案?如果它是符號/指標,它可以被分隔並存儲在內存映射文件中並被共享。

既然你是在3.5,你不能直接使用MMF文件,但FileMap應該爲你工作

https://github.com/tomasr/filemap/tree/master

+0

最後我使用了FileMap,因爲NamedPipes似乎無法在任何版本的Mono Unity中使用。我還使用[this](http://www.codeproject.com/Articles/7851/A-C-Framework-for-Interprocess-Synchronization-and)來同步對內存映射文件的訪問。 –

2

在我的公司,我們正在使用的解決方案是XML的組合對象序列化和FileSytemWatcher或多或少與命名管道相同,但速度很快且運行良好。

+0

我想避免以任何方式序列化對象,因爲可能有許多這些對象,它們都將每秒更改60次,所以即使是二進制序列化也會導致嚴重的開銷。我希望我的工具能夠實時實時反映對象的當前狀態。謝謝 –

+0

@ T.Kiley'每秒60次'對於一臺體面的電腦來說毫無意義。 –

+0

嗯,好吧,我認爲這將是,在這種情況下,我可以只使用管道和BinarySerialiser ... –

2

我覺得WCF與NetNamedPipeBinding將是一個更容易/更好的選擇。

示例here

+0

這似乎是理想的,但是,我在將它與Unity結合時遇到問題。我從ServiceModel DLL中的各種類型上得到了TypeLoad異常(儘管我將DLL複製到Unity項目中)所以這可能是不可能的... –

+0

感謝您的信息!我不確定它如何直接與Unity一起工作,但命名管道看起來像最簡單的選項。如果您找到解決方案,請更新,這將是一個新的學習。 – Abhinav

+1

只是爲了讓你知道我必須和MemoryMappedFile一樣,看起來Unity不像NetNamedPipes。感謝您的幫助:) –

相關問題