在C#进程之间共享对象的推荐方法

时间:2014-01-09 21:06:43

标签: c# ipc

我已经阅读了2个C#应用程序及其优缺点之间关于IPC的许多不同内容,但是我觉得我的用例尚未得到满意的答案。

我有一个已经存在的对象会经常更改(我正在尝试将我的工具附加到游戏中并使用它来调试使用该工具创建的元素)。因此,我不相信序列化是合适的,因为我基本上是没有充分理由每秒60次序列化/反序列化对象。结果,管道是不可能的(或者我在这里遗漏了什么?)。

由于游戏在Unity中运行,我仅限于.NET 3.5技术,因此无法使用新的.NET4共享内存类。

所以似乎.NET远程处理是可行的方式。它不太理想 - 我不需要网络支持,我想要共享的对象是在内存中,没有真正的理由使用代理和发送消息来改变它。

但是,每个人都链接到的this tutorial似乎并不好 - 源代码不能编译,当我得到它编译它崩溃了。教程本身没有引用Cache类,它似乎是中心的,即使使用源代码,我也看不到它如何适合我的应用程序。有更好的资源吗?这真的是最好的方法。

最后,我将继续使用C ++进行插值,以使用创建共享内存并将对象移入其中的非托管功能。在我走下那个兔子洞之前,我想确认它们确实不是一个更好的方法。

更新 - 更多信息

目前只是尝试了2个控制台应用程序。但是,最后我有一个C#/ Winforms应用程序(这个 是.NET 4.0,如果有帮助的话),我将连接到Unity进程(显然我无法控制)。我有一个工具和Unity使用的DLL。我打算用一个允许工具访问对象的类(例如,如果我可以使用管道,我会调用此类来创建管道,然后从工具连接到管道)。

对象本身基本上代表一个有限状态机,其描述是从XML文件加载的。可以从非常少量的数据重新创建对象。但是,我宁愿避免手工编写使用某种事件/消息系统的解决方案来保持对象与哪个状态处于活动状态等同步。

3 个答案:

答案 0 :(得分:2)

在我的公司,我们使用的解决方案是XML对象序列化和FileSytemWatcher的组合,它与命名管道大致相同,但它很快且运行良好。

答案 1 :(得分:2)

我认为使用NetNamedPipeBinding的WCF将是一个更容易/更好的选择。

示例here

答案 2 :(得分:1)

我们在这里谈论什么样的数据?如果是符号/度量标准,则可以将其分隔并存储在内存映射文件中并进行共享。

由于您使用的是3.5,因此无法直接使用MMF文件,但FileMap应该适合您

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