使用MemoryMappedFile共享变量会产生错误

时间:2014-11-26 08:01:19

标签: c# .net shared-memory memory-mapped-files

我需要从App" A"分享变量值。在同一系统上的不同应用程序。我需要根据需要只使用MemoryMappedFiles。我创建了另一个简单的App" B"从App A读取共享变量的值。 但App" B"给出错误

  

无法找到指定的文件。

使用VS 2012用C#编写的App A和B示例:

点击应用A的按钮点击事件以共享变量名称:

private void button1_Click(object sender, EventArgs e)
{
    string Name = txtName.Text.ToString();
    int howManyBytes = Name.Length * sizeof(Char) + 4;
    label1.Text = howManyBytes.ToString();

    using (var MyText = MemoryMappedFile.CreateOrOpen("MyGlobalData", howManyBytes, MemoryMappedFileAccess.ReadWrite))
    {
        byte[] array1 = new byte[howManyBytes];
        array1 = GetBytes(Name);

        using (var accessor = MyText.CreateViewAccessor(0, array1.Length))
        {
            accessor.WriteArray(0, array1, 0, array1.Length);
        }
    }

}

static byte[] GetBytes(string str)
{
    byte[] bytes = new byte[str.Length * sizeof(char)];
    System.Buffer.BlockCopy(str.ToCharArray(), 0, bytes, 0, bytes.Length);
    return bytes;
}

按钮点击应用B的事件以读取共享变量MyGlobalData:

try
{
    using (var mmf = MemoryMappedFile.OpenExisting("MyGlobalData"))
    {
        using (var accessor = mmf.CreateViewAccessor(0, 34))
        {
            byte[] array1 = new byte[34];
            accessor.ReadArray(0, array1, 0, array1.Length);

            string result = System.Text.Encoding.UTF8.GetString(array1);
            txtName.Text = result;
        }
    }
}
catch (Exception ex)
{
    MessageBox.Show(" Error :- " + ex.Message.ToString());
}

当尝试从App B读取共享变量时,它会给出错误

  

无法找到指定的文件

我是否需要在txt文件中写入变量值然后共享它?

1 个答案:

答案 0 :(得分:2)

内存映射文件有两种类型

  • 持久内存映射文件
  • 非持久内存映射文件

您正在创建非持久内存映射文件,因此当最后一个进程关闭然后处理MMF时,它将被销毁。您通过使用语句调用Dispose来关闭句柄,因此MMF被销毁。

您需要保持MMF打开,或使用持久内存映射文件。为了保持MMF的开放,请不要处理它。

For more information