Обмен между приложениями

Последнее обновление: 10.11.2011

Взаимодействие между различными приложениями может осуществляться по разному, например, через сокеты. Но в .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();
        }
    }
}

Теперь запускаем первое приложение, вводим сообщение и отправляем его в память. Затем запускаем второе приложение и видим наше сообщение из разделяемой памяти.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850