Tea*_*Bee 18 .net memory ipc pipe named-pipes
我找不到这个问题的任何有用的答案,尽管已经多次以不同的方式提出这个问题.
我想在两个进程(两个不同的应用程序)之间共享一个内存,以便其中一个可以写入该内存而另一个可以读取.
这在.NET中可行吗?怎么样?
谢谢
Han*_*ant 30
目前,.NET不支持部分(也称为内存映射文件).很快,4.0版本将具有System.IO.MemoryMappedFiles命名空间.有这么好的理由花了这么长时间,也是你不会对这种添加感到满意的原因.在MMF中必须使用指针,共享内存在特定地址可用.要共享一个值,您必须将其写入特定地址.
但是,指针与托管内存模型根本不兼容.对象在垃圾收集堆中创建,收集器根据需要移动它们以保持堆压缩.在托管语言中,您可以引用此类对象,也称为"跟踪句柄".C/C++等价物是一个指针,但它是一个带有铃声的指针,垃圾收集器总能找回它并更新它的值.CLR确实支持"固定"的概念,它将引用转换为指针.它通过将对象标记为不可移动来实现此目的.然而,这无助于通过MMF实现共享内存,该对象固定在GC堆中,而不是MMF视图所在的虚拟内存地址.
要使MMF工作,需要将对象从GC堆复制到共享内存.这需要序列化..NET 4.0类名为MemoryMappedViewStream.您可能会看到它的位置,这与使用命名管道或套接字无法区分.将数据输入和输出MMF需要花费相同的精力.MMF仅略高一些,因为底层缓冲区不在内核内存池中.
你可以打破规则,今天就这样做.您可以P/Invoke创建MMF所需的CreateFileMapping,OpenFileMapping和MapViewOfFile.并使用unsafe关键字,以便您可以创建指针.您需要为共享内存元素使用值类型(如struct)或使用Marshal类.
工控机
如果您正在谈论进程间通信。有多种可能性,例如使用 tcp/udp 套接字、邮槽、命名管道、内存映射文件、Windows 消息等。
.Net 还提供了一些更高级别的 IPC,例如使用前面提到的技术的.Net 远程处理和WCF 。你可以在这里读更多关于它的内容。
内存映射文件
如果您确实想共享一块内存而不是通信,那么内存映射文件可能就是您想要的。.Net 4.0为此提供了MemoryMappedFile 。如果您不使用或不能使用 .Net 4.0,您可以按照此win32 示例自行实现它。或者您可以尝试此代码或查看是否可以使用此处和此处提到的 MemoryMappedFileStream 。或者使用这个FileMap类。