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

Взаимодействовать между различными приложениями можно по разному, например, через сокеты. Но в .NET 4.0 была введена новая функциональность, которая представляет собой создание участка общей разделяемой памяти для приложений.
Основной функционал новой технологии заключается в пространстве имен System.IO.MemoryMappedFiles
Создадим два консольных приложения, одно из которых будет посылать сообщение в общую память, а другое - считывать это сообщение.

pict1 300x91 Обмен данными между приложениями

Код первого приложения:

Imports System.IO.MemoryMappedFiles

Module Module1
     Sub Main()
        Console.WriteLine("Введите сообщение")
        'Ввод выражения для записи в общую память
        Dim message As Char() = Console.ReadLine()
        'Размер введенного сообщения
        Dim size As Integer = message.Length
         'Создание участка разделяемой памяти
        'Первый параметр - название участка, 
        'второй - длина участка памяти в байтах: тип char  занимает 2 байта 
        'плюс четыре байта для одного объекта типа Integer
        Dim sharedMemory As MemoryMappedFile = MemoryMappedFile.CreateOrOpen("MemoryFile", size * 2 + 4)
         'Создаем объект для записи в разделяемый участок памяти
        Using writer As MemoryMappedViewAccessor = sharedMemory.CreateViewAccessor(0, size * 2 + 4)
            'запись в разделяемую память
            'запись размера с нулевого байта в разделяемой памяти
            writer.Write(0, size)
            'запись сообщения с четвертого байта в разделяемой памяти
            writer.WriteArray(Of Char)(4, message, 0, message.Length)
        End Using       
         Console.WriteLine("Сообщение записано в разделяемую память")
        Console.WriteLine("Для выхода из программы нажмите любую клавишу")
        Console.ReadLine()
    End Sub
 End Module

Код второго приложения:

Imports System.IO.MemoryMappedFiles

Module Module1
     Sub Main()
        'Массив для сообщения из общей памяти
        Dim message As Char()
        'Размер введенного сообщения
        Dim size As Integer
         'Получение существующего участка разделяемой памяти
        'Первый параметр - название участка, 
        'второй - длина участка памяти в байтах: тип char  занимает 2 байта 
        'плюс четыре байта для одного объекта типа Integer
        Dim sharedMemory As MemoryMappedFile = MemoryMappedFile.OpenExisting("MemoryFile", size * 2 + 4)
        'Сначала считываем размер сообщения, чтобы создать массив данного размера
        'Integer занимает 4 байта, начинается с первого байта, поэтому передаем цифры 0 и 4
        Using reader As MemoryMappedViewAccessor = sharedMemory.CreateViewAccessor(0, 4, MemoryMappedFileAccess.Read)
            size = reader.ReadInt32(0)
        End Using
         'Считываем сообщение, используя полученный выше размер
        'Сообщение - это строка или массив объектов char, каждый из которых занимает два байта
        'Поэтому вторым параметром передаем число символов умножив на из размер в байтах плюс
        'А первый параметр - смещение - 4 байта, которое занимает размер сообщения
        Using reader As MemoryMappedViewAccessor = sharedMemory.CreateViewAccessor(4, size * 2, MemoryMappedFileAccess.Read)
            'Массив символов сообщения
            message = New Char(size - 1) {}
            reader.ReadArray(Of Char)(0, message, 0, size)
        End Using
        Console.WriteLine("Получено сообщение :")
        Console.WriteLine(message)
        Console.WriteLine("Для выхода из программы нажмите любую клавишу")
        Console.ReadLine()
    End Sub
 End Module

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

  Метки: ,
  AeroWhite
  Просмотров: 6 786
  Запись опубликована в 09:50

3 комментария

  • а как message из char() привести к char?

    • Вам нужно получить один символ?

      На счет второго вопроса - не знаю, может скорым временем автор статьи ответит.

  • между пользователем и SYSTEM не передается, USER - USER или SYSTEM - SYSTEM работает

Есть что сказать? Тогда действуй!