MemoryMappedFile.openExisting:使用 2 个不同的进程时找不到指定的文件
MemoryMappedFile.openExisting : specified file not found when using 2 different process
我正在使用 2 个不同的进程,说 -
Process1.exe :执行一些操作并更新一个字符串变量,该变量将保存在 MemoryMappedFile(以实现 IPC ) 即 文件
Process2.exe:调用 Process1。 "Process1" 完成后,它会尝试打开 MemoryMappedFile file 并获取字符串以供进一步使用。
这是代码片段 -
Process1.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;
}
}
}
}
这是我的消息class,它写在两个进程中,
class Message
{
public string strName;
}
问题: 在完成 Process1 后,它已成功将字符串数据写入 MemoryMappedFile但是当我尝试使用
行在 Process2 中打开 file 时
MemoryMappedFile file = MemoryMappedFile.OpenExisting("file")
我遇到错误 - Specified file not found
。
我对实现 IPC 的 MemoryMappedFile 非常陌生。有人可以建议我在这里做错了什么吗?
您使用的 MemoryMappedFile.CreateOrOpen()
将创建一个非持久内存映射文件。在使用 (MemoryMappedFile mmf =
) 结束时(或在 Process1
结束时)文件将是 "destroyed" (它将不复存在)。
解决方法:使用真实文件。
其他解决方案可能是在调用子进程之前在父进程中打开内存映射。甚至还有一个 CreateOrOpen
重载接受 HandleInheritability
将句柄传递给子进程(我不知道具体是怎么做的),但也许没有必要。
我正在使用 2 个不同的进程,说 -
Process1.exe :执行一些操作并更新一个字符串变量,该变量将保存在 MemoryMappedFile(以实现 IPC ) 即 文件
Process2.exe:调用 Process1。 "Process1" 完成后,它会尝试打开 MemoryMappedFile file 并获取字符串以供进一步使用。
这是代码片段 -
Process1.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;
}
}
}
}
这是我的消息class,它写在两个进程中,
class Message
{
public string strName;
}
问题: 在完成 Process1 后,它已成功将字符串数据写入 MemoryMappedFile但是当我尝试使用
行在 Process2 中打开 file 时MemoryMappedFile file = MemoryMappedFile.OpenExisting("file")
我遇到错误 - Specified file not found
。
我对实现 IPC 的 MemoryMappedFile 非常陌生。有人可以建议我在这里做错了什么吗?
您使用的 MemoryMappedFile.CreateOrOpen()
将创建一个非持久内存映射文件。在使用 (MemoryMappedFile mmf =
) 结束时(或在 Process1
结束时)文件将是 "destroyed" (它将不复存在)。
解决方法:使用真实文件。
其他解决方案可能是在调用子进程之前在父进程中打开内存映射。甚至还有一个 CreateOrOpen
重载接受 HandleInheritability
将句柄传递给子进程(我不知道具体是怎么做的),但也许没有必要。