Взаимодействие между различными приложениями может осуществляться по разному, например, через сокеты. Но в .NET 4.0 была введена новая функциональность, которая представляет собой создание участка общей разделяемой памяти для приложений.
Основной функционал новой технологии заключается в пространстве имен System.IO.MemoryMappedFiles
Создадим два консольных приложения, одно из которых будет посылать сообщение в общую память, а другое - считывать это сообщение.
Для этого нам потребуются два класса: MemoryMappedFile - он будет создавать участок разделяемой памяти и MemoryMappedViewAccessor- с его помощью мы будем проводить взаимодействие (чтение/запись) с общей памятью.
Код приложения, записывающего сообщение в память.
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO.MemoryMappedFiles; namespace WriteMemoryAp { class Program { static void Main(string[] args) { Console.WriteLine("Введите сообщение"); //Ввод выражения для записи в общую память char[] message = Console.ReadLine().ToCharArray(); //Размер введенного сообщения int size = message.Length; //Создание участка разделяемой памяти //Первый параметр - название участка, //второй - длина участка памяти в байтах: тип char занимает 2 байта //плюс четыре байта для одного объекта типа Integer MemoryMappedFile sharedMemory = MemoryMappedFile.CreateOrOpen("MemoryFile", size * 2 + 4); //Создаем объект для записи в разделяемый участок памяти using (MemoryMappedViewAccessor writer = sharedMemory.CreateViewAccessor(0, size * 2 + 4)) { //запись в разделяемую память //запись размера с нулевого байта в разделяемой памяти writer.Write(0, size); //запись сообщения с четвертого байта в разделяемой памяти writer.WriteArray<char>(4, message, 0, message.Length); } Console.WriteLine("Сообщение записано в разделяемую память"); Console.WriteLine("Для выхода из программы нажмите любую клавишу"); Console.ReadLine(); } } }
Код приложения, считывающего сообщение из памяти.
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO.MemoryMappedFiles; namespace ReadMemoryAp { class Program { static void Main(string[] args) { //Массив для сообщения из общей памяти char[] message; //Размер введенного сообщения int size; //Получение существующего участка разделяемой памяти //Параметр - название участка MemoryMappedFile sharedMemory = MemoryMappedFile.OpenExisting("MemoryFile"); //Сначала считываем размер сообщения, чтобы создать массив данного размера //Integer занимает 4 байта, начинается с первого байта, поэтому передаем цифры 0 и 4 using (MemoryMappedViewAccessor reader = sharedMemory.CreateViewAccessor(0, 4, MemoryMappedFileAccess.Read)) { size = reader.ReadInt32(0); } //Считываем сообщение, используя полученный выше размер //Сообщение - это строка или массив объектов char, каждый из которых занимает два байта //Поэтому вторым параметром передаем число символов умножив на из размер в байтах плюс //А первый параметр - смещение - 4 байта, которое занимает размер сообщения using (MemoryMappedViewAccessor reader = sharedMemory.CreateViewAccessor(4, size * 2, MemoryMappedFileAccess.Read)) { //Массив символов сообщения message = new char[size]; reader.ReadArray<char>(0, message, 0, size); } Console.WriteLine("Получено сообщение :"); Console.WriteLine(message); Console.WriteLine("Для выхода из программы нажмите любую клавишу"); Console.ReadLine(); } } }
Теперь запускаем первое приложение, вводим сообщение и отправляем его в память. Затем запускаем второе приложение и видим наше сообщение из разделяемой памяти.