猿问

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

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


Process1.exe : 执行一些操作并更新一个字符串变量,该变量将保存在一个MemoryMappedFile (To acheive IPC) 中,它是文件


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


这是代码片段-


进程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);

}

}

进程2.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但是当我尝试使用 line在Process2 中打开文件时


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


我收到错误 - Specified file not found。


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


Helenr
浏览 855回答 1
1回答

慕丝7291255

在MemoryMappedFile.CreateOrOpen()您使用将创建一个非持久性内存映射文件。在使用 ( MemoryMappedFile mmf =)结束时(或在 结束时Process1),文件将被“销毁”(它将不复存在)。解决方案:使用真实文件。其他解决方案可能是在调用子进程之前打开父进程中的内存映射。甚至有一个CreateOrOpen重载接受 aHandleInheritability将句柄传递给子进程(我不知道具体如何),但也许没有必要。
随时随地看视频慕课网APP
我要回答