プロセス間通信の良いサンプルがないか探していたが、
なかなか見つからなかった。
今まで、ソケット通信でデータの受け渡しをしていたところを、
メモリマップドファイルという技術を使って、
大体できるらしいことがわかった。
出典: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();
}
}
}