Фев 6, 2014 - Уроки Visual Basic.NET 3 комментария
Обмен данными между приложениями
Взаимодействовать между различными приложениями можно по разному, например, через сокеты. Но в .NET 4.0 была введена новая функциональность, которая представляет собой создание участка общей разделяемой памяти для приложений.
Основной функционал новой технологии заключается в пространстве имен System.IO.MemoryMappedFiles
Создадим два консольных приложения, одно из которых будет посылать сообщение в общую память, а другое - считывать это сообщение.
Код первого приложения:
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
а как message из char() привести к char?
Вам нужно получить один символ?
На счет второго вопроса - не знаю, может скорым временем автор статьи ответит.
между пользователем и SYSTEM не передается, USER - USER или SYSTEM - SYSTEM работает