Подтвердить что ты не робот

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

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

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

Возможно ли это в .NET? Как?

Спасибо

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

IPC

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

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

Файлы с отображением памяти

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

Ответ 3

Используйте named pipe.

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

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

Ответ 4

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