2010-07-29 99 views
0

我目前正在研究2个必须相互通信的.NET应用程序。简单的Windows消息传送被选中,这在目前很好用。 在消息中发送的数据是一个简单的字符串,但现在我创建了一个消息类,其中包含一个命令(枚举)和一个数据(字符串)成员,以及后来可能的其他成员。IPC:WM_COPYDATA +序列化/反序列化

当我发送这样的消息类的实例时,它被序列化为字节,然后转换为base64字符串。然后使用Windows的SendMessage()发送出去。 另一方面,我则相反。最终,原始对象将在其他应用程序中恢复并可用。

虽然这个机制似乎有效,但我想知道这是否安全。 事实上,有一些开销,base64字符串比原始字符串解决方案长得多(但我必须手动解析此tring以获取命令和数据部分) 可以使用SendMessage发送的消息的最大大小是多少?

此外,我宁愿远离.NET远程处理这个项目,并留在SendMessage解决方案。

任何想法的?也许使用JSON来限制开销?

谢谢。

鼠兔

+1

这是如此“老派”,它给我的眼睛带来了泪水... – 2010-07-29 00:42:31

+1

它也给我的眼睛带来了泪水,但不是“哦,男人,我想念那些日子”那种眼泪。 – 2010-07-29 00:47:55

回答

1

使用XDMessaging(http://xdmessaging.codeplex.com/)支持WM_COPYDATA,命名管道和IOStream消息传递 - 提供高度灵活,强大且经过测试的解决方案,而不是自己动手。

如何使用XDMessaging在您的课堂上使用二进制序列化(http://msdn.microsoft.com/en-us/library/4abbf6k0(v=VS.71).aspx)?这将是非常紧凑和非常容易实施。

+0

在引擎盖下,我已经在使用XDMessaging。它确实工作得很好,但你只能用它发送字符串。使用[Serializable]和BinaryFormatter给了我一个比我使用的方法更长的字节数组,但它们都工作。 – 2010-07-29 07:04:48

+0

看来,我正在使用的方法导致没有正确反序列化的对象。然后我使用了你所描述的方法,这个工作正确。谢谢! – 2010-07-29 08:13:40

+0

库现在支持发送可序列化的对象 – TheCodeKing 2013-03-13 21:58:30

0

如果你只需要发送消息看一个消息总线架构像Rhino Service BusNServiceBus。他们将提供一个相对简单和更健壮的消息传递实现。

+0

有趣,但现在我只需要在同一台机器上的IPC。 – 2010-07-29 07:19:31

+0

消息总线系统也可以在同一台机器上的两个进程之间工作。如果你以后需要在两台机器之间工作,那么这个改变是“不容易的”。 – 2010-07-29 12:02:27

0

我真的推荐使用更现代的,可扩展的方法。例如,您可以轻松地使用named pipes进行通信,只需使用标准流功能,而不是尝试发送需要编码的消息。

(就个人而言,我可能会使用WCF,因为有这么多的好处,包括让这对跨越不同的机器上工作了免费的...)

+0

的确,问题是我必须坚持使用.NET 2.0框架。但是,我可能会在未来看看命名管道。 – 2010-07-29 07:13:12

+0

@ pika81:听起来好像你已经找到了解决方案,但是如果没有,你可以考虑使用为.net 2提供命名管道支持的东西,比如:http://www.switchonthecode.com/tutorials/interprocess-通信使用命名管道在csharp – 2010-07-29 15:52:01

+0

Thx,我也发现这非常有用的职位:http://blog.benday.com/archive/2008/06/22/23182.aspx – 2010-07-29 21:22:43