在C#中运行的应用程序之间共享不可序列化的控制对象

时间:2016-03-26 12:23:17

标签: c# shared-memory

有没有办法在两个不同的应用程序之间共享不可序列化的控制对象。

我使用下面的代码在两个应用程序之间共享数据,它运行正常。 我的问题是我需要在这些应用程序之间共享不可序列化的对象。

申请一

using (MemoryMappedFile mmf = MemoryMappedFile.CreateNew("testmap", 10000))
{
    bool mutexCreated;
    Mutex mutex = new Mutex(true, "testmapmutex", out mutexCreated);
    using (MemoryMappedViewStream stream = mmf.CreateViewStream())
    {
        BinaryWriter writer = new BinaryWriter(stream);
        writer.Write(1);
    }
    mutex.ReleaseMutex();

    string path = @"Second Application's path";

    //Run second application
    Process pr = new Process();
    ProcessStartInfo prs = new ProcessStartInfo();
    prs.FileName = path;
    pr.StartInfo = prs;
    bool ret = pr.Start();

    mutex.WaitOne();
    using (MemoryMappedViewStream stream = mmf.CreateViewStream())
    {
        BinaryReader reader = new BinaryReader(stream);
        MessageBox.Show(String.Format("Process A says: {0}", reader.ReadBoolean()));
        MessageBox.Show(String.Format("Process B says: {0}", reader.ReadBoolean()));
    }
    mutex.ReleaseMutex();
}

申请第二

try
{
    using (MemoryMappedFile mmf = MemoryMappedFile.OpenExisting("testmap"))
    {

        Mutex mutex = Mutex.OpenExisting("testmapmutex");
        mutex.WaitOne();

        using (MemoryMappedViewStream stream = mmf.CreateViewStream(1, 0))
        {
            BinaryWriter writer = new BinaryWriter(stream);
            writer.Write(0);
        }
        mutex.ReleaseMutex();
    }
}
catch (FileNotFoundException)
{
    MessageBox.Show("Memory-mapped file does not exist. Run Process A first.");
}

任何人都可以帮助我解决问题。

1 个答案:

答案 0 :(得分:0)

据我所知,内存映射文件不能直接包含实时管理对象。有两种方法可以使用内存映射文件:使用 MemoryMappedViewStream (我们的示例正在执行),或使用 MemoryMappedViewAccessor 。后者允许您将其视为内存的大缓冲区,使用 ReadDouble(offset) Write(offset,doubleValue)等调用来读取和写入内存。还有用于读取和写入数组的存取方法。