【问题标题】:Sharing non-serializable control objects between running applications in C#在 C# 中运行的应用程序之间共享不可序列化的控件对象
【发布时间】:2016-03-26 12:23:16
【问题描述】:

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

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

应用一

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.");
}

谁能帮我解决一下。

【问题讨论】:

    标签: c# shared-memory


    【解决方案1】:

    据我所知,内存映射文件不能直接包含实时托管对象。有两种方法可以使用内存映射文件:使用 MemoryMappedViewStream(我们的示例正在这样做),或使用 MemoryMappedViewAccessor。后者让您可以将其视为内存的大缓冲区,通过 ReadDouble(offset)Write(offset, doubleValue) 之类的调用来读取和写入它。还有用于读取和写入数组的访问器方法。

    【讨论】:

    • MemoryMappedViewAccessor 的任何示例,或者是否有另一种方法可以在两个应用程序之间共享活动对象。
    • 快速互联网搜索发现示例:herehere。如果您花费比我更多的时间搜索,我敢肯定还有更多。
    • 我不知道如何在进程之间自动共享 CLR 对象的一个​​实例。如果您真的有动力,您可以通过编写一个包装类来模拟共享对象,该类将使用共享内存映射文件在每个进程中存在的实例之间传达更新。如果您的信息很复杂,这可能需要大量工作。
    猜你喜欢
    • 2013-05-02
    • 2014-03-24
    • 2015-04-04
    • 1970-01-01
    • 2012-04-05
    • 1970-01-01
    • 1970-01-01
    • 2010-12-10
    相关资源
    最近更新 更多