Tag: ipc

没有网络依赖的进程间pubsub

假设我的计算机上没有安装网卡,我希望function类似于以下内容: 进程1将消息发布到某个URI,例如“Uri1” var publisher = new Publisher(“Uri1”); publisher.publish(new Message(“Somedata”); 进程2将监听“Uri1”上的消息并将消息发布到“Uri2” var subscriber = new Subscriber(“Uri1”) subscriber.MessageReceived += data => Console.Writeline(data.ToString()); var publisher = new Publisher(“Uri2”) publisher.Publish(new Message(“SomeMoreData”)) 进程3将侦听来自两个URI的消息 var subscriber = new Subscriber(“Uri1”) subscriber.MessageReceived += data => Console.Writeline(data.ToString()); var anotherSubscriber = new Subscriber(“Uri2”) anotherSubscriber.MessageReceived += data => Console.Writeline(data.ToString()); 所有进程都在同一台计算机上运行。 经过一些研究后,我相信MSMQ是可行的方法(使用队列名称作为URI),但实施问题仍然存在。 我遇到了几种可能性: 直接使用MSMQ 我用这种方法遇到的问题是我必须管理我自己的队列,例如创造,人口,清除…也从我读到的内容中我可能会遇到许多陷阱和MSMQ的局限性因为我没有经验 使用NServiceBus , […]

将参数发送到驻留在另一个进程中的app-instance

我有一个单实例应用程序(c#,WPF,.net3.51)。 检查应用程序是否已实例化是通过互斥锁完成的。 如果应用程序已在运行,我将从已打开的应用程序实例中打开一个新窗口。 这到目前为止工作正常。 但是由于应用程序扩展,我现在必须将e.Args(或至少它的第一个字符串)发送到驻留在另一个进程中的已经运行的实例。 这怎么做得最好? 附加信息 目前我使用全球注册的Window消息,我通过PostMessage(HWND_BROADCAST)发送给所有打开的应用程序。 如果收到此消息,我的应用程序将查找此消息并打开一个新窗口。 一个想法是设置PostMessage的参数。 然而,我发现了很多关于这个话题的令人眼花缭乱的信息,因此我没有勇气走这条路。 除此之外,我想通过另一个激活逻辑替换全局PostMessage调用,因为全局调用似乎有一些不可思议的副作用。

读取内存映射文件或知道其大小以正确读取它

在这个问题上, 读取内存映射文件或内存映射视图访问器的所有内容,而不知道它的大小 有一个问题, (int)stream.Length没有给我正确的长度,而是给出了使用的内部缓冲区的大小! 我需要刷新这个问题,因为它非常紧迫。 主要问题是: 我需要类似于ReadToEnd或ReadAllBytes的东西来使用MappedViewAccessor读取MemoryMappedFile的所有内容,如果我不知道它的大小,我该怎么办呢? 我已经搜索过了,我已经看到了这个问题,但这不是我要找的东西: 如何从.NET中的内存映射文件中快速读取字节? 旧答案是: 酒馆 public static ReadMMFAllBytes(string fileName) { using (var mmf = MemoryMappedFile.OpenExisting(fileName)) { using (var stream = mmf.CreateViewStream()) { using (BinaryReader binReader = new BinaryReader(stream)) { return binReader.ReadBytes((int)stream.Length)); } } } } 在这个问题中: 内存映射文件长度 确切的问题没有确切的答案! 问题是关于标题之外的其他问题。

重定向stdin和stdout,其中stdin首先关闭

这实际上与我已经回答的另一个问题有关。 这个问题在这里: 将一个进程对象的stdout重定向到另一个进程对象的stdin 我的问题是(我认为)获得输入的程序应该在程序输出之前退出。 这是我正在做的bash相当于:tccat -i / dev / sr0 -T 1 | ffmpeg -i – -r 1 -t 1 -s 96×72 -ss 5 /tmp/wsmanage/preview_tmp/test\%03d.jpg 这只是使用一个名为tccat的程序来读取DVD的第一个标题。 这将输出到ffmpeg,它将以.jpg格式创建一个每秒1帧的输出文件,长度为1秒。 一旦输出其框架(或两个),它就会存在。 这很好用。 但是,以下代码没有。 我得到了“打印行到ffmpeg”的大量内容,而命令行版本只需一秒钟即可退出。 然后,它在30或40秒左右停止打印。 FFmpeg永远不会退出,我的程序永远不会继续。 我这样做对吗? Process tccatProcess = new Process(); tccatProcess.StartInfo.FileName = “tccat”; tccatProcess.StartInfo.Arguments = String.Format(“-i {0} -T {1}”, devNode, title); tccatProcess.StartInfo.UseShellExecute = false; tccatProcess.StartInfo.RedirectStandardOutput = […]

C ++和C#中的二进制序列化/反序列化

我正在开发一个分布式应用程序,它有两个组件。 一个用标准C ++编写( 不是托管C ++ ,在Linux平台上运行),另一个用C#编写。 两者都通过消息总线进行通信。 我有一种情况需要将对象从C ++传递到C#应用程序,为此我需要在C ++中序列化这些对象并在C#中对它们进行反序列化(类似于.NET中的编组/解组)。 我需要以二进制而不是XML(由于性能原因)执行此序列化。 我已经使用Boost.Serialization来实现这一点,当两端都是用C ++实现的,但现在我的一端有.NET应用程序, Boost.Serialization不是一个可行的解决方案。 我正在寻找一种解决方案,允许我跨C ++和.NET边界执行(反)序列化,即跨平台二进制序列化 。 我知道我可以在C ++ DLL中实现(de)序列化代码并在.NET应用程序中使用P/Invoke ,但我想保留它作为最后的手段。 另外,我想知道我是否使用像gzip这样的标准,这会有效吗? 除了gzip还有其他选择吗? 它们的优点/缺点是什么? 谢谢

登录方法使用GINA进行自定义

我知道在GINA中找到一个主人并不容易,但我的问题是最接近进程间通信(IPC),我在非托管c ++中编写了我的自定义GINA,我在其中包含了一个检查用户指纹有效性的方法尝试要登录,这个函数会在用c#编写的运行系统windows服务中调用一些方法,代码如下: 在GINA中,非托管c ++ if(Fingerprint.Validate(userName,finerprintTemplate) { //perform login } 在Windows服务中,C# public class Fingerprint { public static bool Validate(string userName, byte[] finerprintTemplate) { //Preform Some code to validate fingerprintTemplate with userName //and retuen result } } 有没有人知道如何在GINA和Windows服务之间进行这种通信,或者只是在c ++编写的服务和C#编写的服务之间进行。 谢谢

C#应用程序与非托管C ++应用程序之间的进程间通信

我有两个Windows服务,第一个用C#编写,第二个用非托管C ++编写,我想知道如何进行双向进程间通信。

在C ++(MFC)应用程序和C#之间传递数据

我们有一个单片MFC GUI应用程序,它接近它在C ++中的生命。 我们计划在C#中构建新function,并在每个应用程序之间传递数据。 问题是:在C ++和C#之间传递数据的最佳方法是什么? 笔记: 两端都有一个GUI前端,可能只需要传递像Id这样的简单数据,并且可能有一种机制,它向另一个应用程序指示要使用的进程/function。 例如,其中一个应用程序将是C#中的CRM系统,当双击网格中的一行时,会传递customerId和一条消息,以在MFC应用程序的客户表单中打开该客户。 我做了一些研究,选项似乎是Windows Messaging,Memory Mapping,Named Pipes或类似Windows Sockets的东西。 在这个阶段,我们倾向于命名管道,但非常感谢其他建议或提示或其他人的经验。

简单的跨平台流程来处理Mono中的通信?

我正在开发一个可在Linux,Mac和Windows上运行的Mono应用程序,并且需要应用程序(在单个操作系统上)才能相互发送简单的字符串消息。 具体来说,我想要一个单实例应用程序。 如果尝试启动第二个实例,它将向已经运行的单个实例发送消息。 DBus已经出局了,因为我不希望这是一个额外的要求。 套接字通信似乎很难,因为Windows似乎不允许连接权限。 Mono似乎不支持内存映射文件。 Mono似乎不支持命名管道。 似乎在Mono上不支持IPC。 那么,是否有一种简单的方法可以将单个计算机上的字符串消息发送到适用于每个操作系统的服务器应用程序,而无需权限或其他依赖项?

完全托管的共享内存.NET实现?

我正在寻找.NET的免费,完全托管的共享内存实现(P / Invoke是可以接受的,混合C ++ / CLI不是)。