【问题标题】:Sharing variable using MemoryMappedFile gives error使用 MemoryMappedFile 共享变量会出错
【发布时间】:2015-01-24 11:20:51
【问题描述】:

我需要将应用程序“A”中的变量值共享给同一系统上的不同应用程序。我只需要根据要求使用 MemoryMappedFiles 。我创建了另一个简单的应用程序“B”,它从应用程序 A 读取共享变量的值。 但是应用程序“B”给出了错误

找不到指定的文件。

使用 VS 2012 用 C# 编写的示例应用 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文件然后分享吗?

【问题讨论】:

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


    【解决方案1】:

    内存映射文件有两种类型

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

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

    您要么需要保持 MMF 打开,要么使用持久内存映射文件。要保持 MMF 处于打开状态,请不要丢弃它。

    For more information

    【讨论】:

    • 让我试试……你建议的方式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-20
    • 2018-03-23
    • 1970-01-01
    • 2014-10-13
    • 2022-08-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多