进程间的C#通信

时间:2010-03-14 18:27:08

标签: c# servicebus

我正在使用应用程序,并且我能够使C#脚本在此环境中运行。我可以将任何类型的DLL导入此环境。我的问题是我想在这些脚本之间启用通信。由于环境受到控制而且我无法访问应用程序的源代码,因此我不知道如何执行此操作。

我尝试过的事情:

  • 文件I / O:只需编写我希望每个读取.txt文件并让另一个读取它的消息。问题是我需要这些脚本运行得非常快,并且占用了太多时间。

  • nServiceBus:我试过这个,但我无法让它在我正在处理的环境中工作。我并不是说不能这样做,只是无法完成。

有没有人知道一种简单的方法,这也很快?

8 个答案:

答案 0 :(得分:4)

进程间通信的方法应该取决于每条消息的处理重要性。

例如,如果流程A告诉流程B,例如,向您的IT员工发送一封电子邮件,说服务器已关闭,那就非常重要了。

如果你是流媒体音频,个别消息(数据包)对应用程序的性能并不重要,可以删除。

如果是前者,则应考虑使用持久存储(如数据库)来存储消息,并让每个进程轮询数据库以检索自己的消息。通过这种方式,如果进程被终止或暂时失去与其他进程的通信,它将能够检索它再次启动时丢失的任何消息。

答案 1 :(得分:3)

即使在同一个过程中,您也可以使用一种进程间通信形式。将您的脚本视为单独的进程,并以这种方式进行通信。

在这种情况下,命名管道可能是一个不错的选择。它们非常快,并且在.NET 3.5中非常容易使用。

或者,如果将脚本加载到单个AppDomain中,则可以使用静态类或单例作为通信服务。但是,如果脚本单独加载,则可能无法实现。

答案 2 :(得分:3)

答案很简单;

由于您可以将任何DLL导入到脚本中,因此您可以创建一个自定义DLL,以您希望的任何方式实现进程之间的通信:共享内存,命名管道,TCP / UDP。

答案 3 :(得分:2)

嗯,不知道你的环境细节,我真的没什么可提供的。您正在使用术语“C#脚本”......我不完全确定这意味着什么,因为C#通常是一种编译语言。

如果你使用普通的C#,你有没有用命名管道查看WCF?如果程序集在同一台物理计算机上运行,​​则应该能够轻松快速地创建一些使用命名管道绑定托管的WCF服务。命名管道在本地环境中提供简单,高效且快速的消息传输机制。 WCF本身非常易于使用,并且是.NET框架的本机组件。

答案 4 :(得分:2)

由于您已经安装了文件I / O,因此可以通过将其放在RAM磁盘上来获得足够的速度。如果您今天轮询更改,FileSystemWatcher可以帮助您提高通信响应速度。

答案 5 :(得分:1)

您可以使用PipeStream。它比使用主存储器的磁盘IO快。

答案 6 :(得分:1)

XMPP / Jabber是另一种方法,请看jabber.net

答案 7 :(得分:1)

另一种简单的方法是在预定义的端口上打开TCP套接字,从其他进程连接到它并以这种方式进行通信。