.net进程互相戳?

时间:2011-10-03 17:05:59

标签: .net ipc

使用.net和w / o使用特定于平台的东西是否有一种方法可以让我的两个应用程序互相戳?这两个应用都将运行。这特别是单向戳。我需要传递一个最小的int64值。它将在Linux上运行单声道,但我将在Windows上开发

-edit-附加信息。一个过程将是asp.net,这意味着我不能花很长时间去做戳。由于页面请求,生命周期将小于50毫秒。此外,我每分钟可能有任何写/戳请求或每10分钟一次

4 个答案:

答案 0 :(得分:1)

我们成功使用的一种方法是命名管道。在.net 3.5中,他们添加了原生支持,因此您不必使用p / invoke来获取相应的win32 API。

结帐:http://www.switchonthecode.com/tutorials/dotnet-35-adds-named-pipes-support为例。

简而言之,您将要做的是创建一个具有指定名称的客户端/服务器机制(“命名管道”);服务器将设置管道并等待客户端连接...客户端将连接到管道并在其上发送数据。

关于这一点的好处是你可以轻松发送整个数据结构(只要它们被标记为[Serializable])。这允许您丰富地实现特定消息(这也包括Enums)

有一点需要注意:默认情况下,命名管道是同步的(阻塞),因此如果服务器未启动,您对Connect()的调用将永远运行〜。您可以使用异步模式,也可以在线程中运行同步代码,以后可以放弃/中止。在铺设基础时要记住这一点,因为如果您没有计划,那么切换到异步管道使用可能会有点工作。

[Serializable]
public enum CmdType
{
    cmdTypeOne,
    someOtherCmdType
}

[Serializable]
public class Command
{
  CmdType eCmdType;
  // other command payload
}

答案 1 :(得分:1)

您可以使用WCF(应该是Mono核心堆栈的一部分) - 请参阅this question

或者,您可以使用消息传递,例如JMS。 Apache ActiveMQ支持C#客户端。 (我们正在对此进行调查,但尚未在生产中尝试过。)

即使进程在不同的计算机上运行,​​这些解决方案中的任何一个都可以工作,这使它们更具可扩展性。

根据您的编辑,消息传递可能是更好的解决方案,因为它本质上是异步的。

答案 2 :(得分:0)

命名管道可能是一种可能的解决方案。 CodeProject上有一篇非常详细的文章,展示了一个例子。这篇文章的开头是:

  

您是否曾经需要在两个.NET应用程序之间交换数据   在同一台机器上运行?例如,一个网站与a   Windows服务? .NET Framework提供了几个不错的选项   进程间通信(IPC),如Web服务和远程处理,   最快的是使用TCP通道和二进制格式化程序进行远程处理。

答案 3 :(得分:0)

内存映射文件很快。尽管API非常不同,但您必须使用P / Invokes编写包装器,以便使用与平台无关的方式来使用它。我们的MsgConnect产品有MMF传输,可以解决您的问题,如果您使用第三方解决方案。当然,对于你非常狭隘的任务,你可以自己制作类似的东西。

相关问题