Фев 6, 2014 -
Уроки Visual Basic.NET
3 комментария
Уроки 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 795
Запись опубликована в 09:50
а как message из char() привести к char?
Вам нужно получить один символ?
На счет второго вопроса - не знаю, может скорым временем автор статьи ответит.
между пользователем и SYSTEM не передается, USER - USER или SYSTEM - SYSTEM работает