MemoryMappedFile.openExisting:使用2个不同进程时找不到指定文件

问题描述 投票:0回答:2

我正在使用 2 个不同的流程,比如说 -

Process1.exe:执行一些操作并更新一个字符串变量,该变量将保存在MemoryMappedFile中(以实现IPC),即file

Process2.exe:调用Process1。 “Process1”完成后,它尝试打开 MemoryMappedFile file 并获取字符串以供进一步使用。

这是代码片段 -

进程1.exe

//Some code
public void DoSomeStuff()
{
onst int MMF_MAX_SIZE = 4096;
const int MMF_VIEW_SIZE = 4096;
try
   {
     using (MemoryMappedFile mmf = MemoryMappedFile.CreateOrOpen("file", MMF_MAX_SIZE, MemoryMappedFileAccess.ReadWrite))
     {
          using (MemoryMappedViewStream stream = mmf.CreateViewStream(0, MMF_VIEW_SIZE))
          {
               Message message1;
               message1.strName = "Some name";
               BinaryFormatter formatter = new BinaryFormatter();
               formatter.Serialize(stream, message1);
          }
     }
   }
catch(Exception e)
{
     MessageBox.Show(e.Message);
}
}

Process2.exe

        const int MMF_VIEW_SIZE = 4096;

        using (MemoryMappedFile file = MemoryMappedFile.OpenExisting("file"))
        {
            using (MemoryMappedViewStream stream = file.CreateViewStream(0, MMF_VIEW_SIZE))
            {
                BinaryFormatter formatter = new BinaryFormatter();
                byte[] buffer = new byte[MMF_VIEW_SIZE];
                Message message1;
                if (stream.CanRead)
                {
                    stream.Read(buffer, 0, MMF_VIEW_SIZE);
                    using (MemoryStream ms = new MemoryStream(buffer))
                    {
                        ms.Seek(0, SeekOrigin.Begin);
                        message1 = (Message)formatter.Deserialize(ms);
                        string name = message1.strName;
                    }
                }
            }
        }

这是我的 Message 类,它是在两个进程中编写的,

class Message
{
    public string strName;
}

问题:完成Process1后,它已成功将字符串数据写入MemoryMappedFile,但是当我尝试使用行Process2中打开file

MemoryMappedFile 文件 = MemoryMappedFile.OpenExisting("文件")

我收到错误 -

Specified file not found

我对实现 IPC 的 MemoryMappedFile 实现非常陌生。有人可以建议我在这里做错了什么吗?

c# memory-mapped-files
2个回答
2
投票

您使用的

MemoryMappedFile.CreateOrOpen()
将创建一个非持久内存映射文件。在使用 (
MemoryMappedFile mmf =
) 结束时(或在
Process1
结束时),文件将被“销毁”(它将不再存在)。

解决方案:使用真实文件。

其他解决方案可能是在调用子进程之前在父进程中打开内存映射。甚至还有一个

CreateOrOpen
重载接受
HandleInheritability
将句柄传递给子进程(我不知道具体如何),但也许没有必要。


0
投票

如果您希望跨进程访问内存 MMF,请在其名称中添加

"Global\\"
前缀。另外,请确保将 MMF 添加到集合中以防止其被丢弃。您可以尝试类似如下的操作:

var mmFName = $"Global\\{Guid.NewGuid().ToString()}";
var mmf = System.IO.MemoryMappedFiles.MemoryMappedFile.CreateNew(
                    mmFName,
                    allocationSize,
                    MemoryMappedFileAccess.ReadWrite,
                    MemoryMappedFileOptions.None,
                    securityDescriptor,
                    HandleInheritability.Inheritable); 
© www.soinside.com 2019 - 2024. All rights reserved.