Я не могу найти полезный ответ для этого вопроса, хотя его спрашивали по-другому несколько раз.
Я хочу совместно использовать память между двумя процессами (два различных приложения), так, чтобы один из них мог записать в ту память, и другой может читать.
Действительно ли это возможно в.NET? Как?
Спасибо
В настоящий момент .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.
IPC
Если вы говорите о межпроцессном взаимодействии. Существует несколько возможностей, таких как использование tcp/udp сокетов, почтовых слотов, именованных труб, файлов с картами памяти, сообщений windows и т.д.
.Net также предлагает некоторые IPC более высокого уровня, такие как .Net remoteing и WCF, которые используют предыдущие упомянутые методы. Подробнее об этом можно прочитать здесь .
Mapped Files
Если вы действительно хотите совместно использовать блок памяти вместо обмена данными, то, возможно, файлы отображения памяти - это то, что вам нужно. В .Net 4.0 для этого есть MemoryMappedFile. Если вы не используете или не можете использовать .Net 4.0, вы можете реализовать его самостоятельно, как в этом примере win32. Или вы можете попробовать этот код или посмотреть, можете ли вы использовать MemoryMappedFileStream, упомянутый здесь и здесь. Или используйте этот класс FileMap.
.Используйте именную трубу .
Это механизм, позволяющий одному процессу записывать последовательные данные в поток, из которого другой процесс может считывать.
Обратите внимание, что именованный канал позволяет считывать только последовательные данные. Если вам нужно использовать более детально проработанные запросы, возможно, вы захотите использовать клиент-серверную архитектуру. В этом случае, процесс чтения запрашивает информацию у другого процесса, используя сетевые сокеты .
. Как уже упоминалось, используйте Mapped Files.
Реализация для .NET < 4 доступна по адресу: http://github.com/tomasr/filemap/
Я использовал и работает безупречно. У вас могут возникнуть некоторые проблемы с безопасностью при совместном использовании между процессами с повышенным/не повышенным уровнем безопасности - решение заключается в инициализации файла отображения памяти в процессе с повышенным уровнем безопасности и установке его атрибутов безопасности соответствующим образом.
Реализация, плюс описание на http://www.softwareinteractions.com/blog/2010/1/21/interprocess-communications-using-shared-memory.html