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

在C#进程之间共享对象的推荐方式,c#,ipc,C#,Ipc,我读过很多关于两个C#应用程序之间IPC的不同内容及其优缺点,但我觉得我还没有对我的用例给出满意的答案 我有一个已经存在的对象,该对象将频繁更改(我正在尝试将我的工具附加到游戏,并使用它调试使用该工具创建的元素)。因此,我不认为序列化是合适的,因为我会毫无理由地以每秒60次的速度序列化/反序列化对象。因此,管道是不可能的(或者我在这里遗漏了什么?) 由于游戏在Unity中运行,我仅限于.NET3.5技术,因此无法使用新的.NET4共享内存类 因此,似乎.NETRemoting是一个不错的选择。这

我读过很多关于两个C#应用程序之间IPC的不同内容及其优缺点,但我觉得我还没有对我的用例给出满意的答案

我有一个已经存在的对象,该对象将频繁更改(我正在尝试将我的工具附加到游戏,并使用它调试使用该工具创建的元素)。因此,我不认为序列化是合适的,因为我会毫无理由地以每秒60次的速度序列化/反序列化对象。因此,管道是不可能的(或者我在这里遗漏了什么?)

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

因此,似乎.NETRemoting是一个不错的选择。这不太理想-我不需要网络支持,我想共享的对象在内存中,没有真正的理由需要使用代理和发送消息来更改它

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

最后,我用C++插入了使用非共享的函数来创建共享内存并将对象移动到其中。在我进入兔子洞之前,我想确认他们真的不是更好的方法

更新-更多信息

目前,我们正在试用2个控制台应用程序。然而,最后我有一个C#/Winforms应用程序(如果有帮助的话,这是.NET4.0),我将连接到Unity进程(显然我无法控制)。我有一个DLL,它是由工具和Unity使用的。我将有一个类,允许工具访问对象(例如,如果我可以使用管道,我将从Unity调用这个类来创建管道,然后从工具连接到管道)


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

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

因为您使用的是3.5,所以不能直接使用MMF文件,但FileMap应该适合您


在我的公司,我们使用的解决方案是XML对象序列化和命名管道的组合,或多或少与命名管道相同,但速度快且工作良好。

我认为WCF with是一个更简单/更好的选择


示例。

快速提问:有问题的两个应用程序是什么?(即:目标是从unity编译的可执行文件,工具是forms exe等)注意:在这种情况下,我可能会尝试将代码挂接到目标应用程序中,该应用程序会启动一个线程,然后我可以对目标的其余部分进行本地控制和访问。。。线程可以报告回调用方间隔,但我喜欢。@谢谢所有的答案,我会检讨他们,并考虑什么将工作最好。阅读了答案后,我发现共享内存可能还不够,原因如下所列,这会让我倒退一个正方形或两个…@ebyrob您能详细说明一下您的意思/如何在运行中连接代码吗?如果我对你的理解是正确的,那听起来可能非常好。这取决于你能得到什么。如果你在游戏的插件中,你是非常棒的。如果什么都没有提供,那么事情就会回到依赖注入的时代。。。你用自己的代码替换已经被调用的东西,这些代码包装了a)期望的东西,b)你额外的东西。(与进程间部分不太相关)注意:还有系统调试器和运行时调试工具,可以让您获得一些动力。Microsoft认为不推荐使用远程处理(请参阅)。我希望避免以任何方式序列化对象,因为可能有许多这样的对象,而且它们每秒都会更改60次,因此即使是二进制序列化也会造成严重的开销。我希望我的工具基本上是实时的,反映对象的当前状态。Thanks@T.Kiley
60次每秒
对于一台像样的计算机来说算不了什么。嗯,好吧,我假设是这样的,在这种情况下,我可以使用管道和二进制序列化器……使用磁盘I/O进行IPC与其说是“正确的方法”,不如说是一种快速而肮脏的解决方案。你基本上是在给你的交流增加一个不必要的中间人(磁盘系统)。设置起来很容易,但是如果有大量的交流,我建议不要这样做。你是对的,将所有这些东西序列化并没有什么大不了的。最后,我使用了一个内存映射文件并转储了每一帧所需的所有数据。这似乎很理想,但是,我在将它与Unity结合时遇到了问题。我从ServiceModel DLL中获得了各种类型的TypeLoad异常(尽管我将DLL复制到Unity项目中),因此这可能是不可能的…感谢您提供的信息!我不确定它将如何直接与Unity一起工作,但命名管道看起来是最简单的选择。如果你找到一个解决方案,一定要更新,这将是一个需要学习的新东西。只是想让你知道我必须使用MemoryMappedFile是的,看起来Unity不喜欢NetNamedPipes。谢谢你的帮助:)@T.Kiley谢谢你提供的信息:)我最后使用了文件映射,因为命名管道在Mono Unity使用的任何版本中似乎都不可用。我还用于同步访问内存映射文件。