メモリマップドファイル

プロセス間通信の良いサンプルがないか探していたが、

なかなか見つからなかった。

今まで、ソケット通信でデータの受け渡しをしていたところを、

メモリマップドファイルという技術を使って、

大体できるらしいことがわかった。

出典:https://corgi-lab.com/programming/csharp-memory-mapped-file/

サーバ:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO.MemoryMappedFiles;
using System.IO;

namespace MemoryMappedFileServer
{
    class Program
    {
        static void Main(string[] args)
        {
            // Open shared memory
            MemoryMappedFile share_mem = MemoryMappedFile.CreateNew(args[0], 1024);
            MemoryMappedViewAccessor accessor = share_mem.CreateViewAccessor();

            // Write data to shared memory
            accessor.Write(0, 256);

            // Dispose accessor
            accessor.Dispose();

            // Sleep
            System.Threading.Thread.Sleep(5000);
        }
    }
}

クライアント:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO.MemoryMappedFiles;
using System.Diagnostics;

namespace MemoryMappedFileClient
{
    class Program
    {
        static void Main(string[] args)
        {
            string filepath = @"MemoryMappedFile.exe";
            string shared_mem_name = "shared_memory_1";

            Process p = new Process();
            p.StartInfo.FileName = filepath;
            p.StartInfo.Arguments = shared_mem_name;
            p.Start();

            System.Threading.Thread.Sleep(1000);

            // Open shared memory
            MemoryMappedFile share_mem = MemoryMappedFile.OpenExisting(shared_mem_name);
            MemoryMappedViewAccessor accessor = share_mem.CreateViewAccessor();

            // Write data to shared memory
            int data = accessor.ReadInt32(0);
            Console.WriteLine("Data = " + data);

            // Dispose resource
            accessor.Dispose();
            share_mem.Dispose();

            p.Dispose();
        }
    }
}