我正在使用应用程序,并且我能够使C#脚本在此环境中运行。我可以将任何类型的DLL导入此环境。我的问题是我想在这些脚本之间启用通信。由于环境受到控制而且我无法访问应用程序的源代码,因此我不知道如何执行此操作。
我尝试过的事情:
文件I / O:只需编写我希望每个读取.txt文件并让另一个读取它的消息。问题是我需要这些脚本运行得非常快,并且占用了太多时间。
nServiceBus:我试过这个,但我无法让它在我正在处理的环境中工作。我并不是说不能这样做,只是我无法完成。
有没有人知道一种简单的方法,这也很快?
答案 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套接字,从其他进程连接到它并以这种方式进行通信。