Общая память между 2 процессами (приложения)

Я не могу найти полезный ответ для этого вопроса, хотя его спрашивали по-другому несколько раз.

Я хочу совместно использовать память между двумя процессами (два различных приложения), так, чтобы один из них мог записать в ту память, и другой может читать.

Действительно ли это возможно в.NET? Как?

Спасибо

18
задан Mohammad Dehghan 24 September 2013 в 07:39
поделиться

5 ответов

В настоящий момент .NET не поддерживает разделы (также известные как файлы с отображением памяти). Скоро появится версия 4.0 с пространством имен System.IO.MemoryMappedFiles. Есть веская причина, по которой это заняло так много времени, а также причина, по которой вы не будете довольны этим дополнением. Использование указателей обязательно в MMF, общая память доступна по определенному адресу. Чтобы поделиться ценностью, вам нужно будет написать ее по определенному адресу.

Однако указатели принципиально несовместимы с моделью управляемой памяти. Объекты создаются в куче со сборкой мусора, сборщик перемещает их по мере необходимости, чтобы куча оставалась сжатой. В управляемом языке у вас есть ссылка на такой объект, также известный как «дескриптор отслеживания». Эквивалент C / C ++ - это указатель, но с включенными колокольчиками, сборщик мусора всегда может найти его и обновить его значение. CLR поддерживает понятие «закрепления», она преобразует ссылку в указатель. Он реализует это, помечая объект как неподвижный. Однако это не помогает реализовать разделяемую память через MMF, объект закреплен в куче GC вместо адреса виртуальной памяти, где находится представление MMF.

Чтобы MMF заработал, необходимо скопировать объект из кучи GC в разделяемую память. Это требует сериализации. Класс .NET 4.0 называется MemoryMappedViewStream. Вы, вероятно, видите, к чему это идет, это неотличимо от использования именованного канала или сокета. Получение данных в MMF и извлечение из него требует одинакового количества усилий. MMF просто немного более эффективен, потому что базовый буфер не находится в пуле памяти ядра.

Вы можете нарушить правила и сделать это сегодня. Вы можете P / Invoke CreateFileMapping, OpenFileMapping и MapViewOfFile, необходимые для создания MMF. И используйте ключевое слово unsafe, чтобы создавать указатели. Вам нужно будет использовать типы значений (например, struct) для элементов общей памяти или использовать класс Marshal.

30
ответ дан 30 November 2019 в 07:33
поделиться

IPC

Если вы говорите о межпроцессном взаимодействии. Существует несколько возможностей, таких как использование tcp/udp сокетов, почтовых слотов, именованных труб, файлов с картами памяти, сообщений windows и т.д.

.Net также предлагает некоторые IPC более высокого уровня, такие как .Net remoteing и WCF, которые используют предыдущие упомянутые методы. Подробнее об этом можно прочитать здесь .

Mapped Files

Если вы действительно хотите совместно использовать блок памяти вместо обмена данными, то, возможно, файлы отображения памяти - это то, что вам нужно. В .Net 4.0 для этого есть MemoryMappedFile. Если вы не используете или не можете использовать .Net 4.0, вы можете реализовать его самостоятельно, как в этом примере win32. Или вы можете попробовать этот код или посмотреть, можете ли вы использовать MemoryMappedFileStream, упомянутый здесь и здесь. Или используйте этот класс FileMap.

.
4
ответ дан 30 November 2019 в 07:33
поделиться

Используйте именную трубу .

Это механизм, позволяющий одному процессу записывать последовательные данные в поток, из которого другой процесс может считывать.

Обратите внимание, что именованный канал позволяет считывать только последовательные данные. Если вам нужно использовать более детально проработанные запросы, возможно, вы захотите использовать клиент-серверную архитектуру. В этом случае, процесс чтения запрашивает информацию у другого процесса, используя сетевые сокеты .

.
1
ответ дан 30 November 2019 в 07:33
поделиться

Как уже упоминалось, используйте Mapped Files. Реализация для .NET < 4 доступна по адресу: http://github.com/tomasr/filemap/
Я использовал и работает безупречно. У вас могут возникнуть некоторые проблемы с безопасностью при совместном использовании между процессами с повышенным/не повышенным уровнем безопасности - решение заключается в инициализации файла отображения памяти в процессе с повышенным уровнем безопасности и установке его атрибутов безопасности соответствующим образом.

0
ответ дан 30 November 2019 в 07:33
поделиться
0
ответ дан 30 November 2019 в 07:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: