Memoria compartida entre 2 procesos (aplicaciones)

No puedo encontrar ninguna respuesta útil para esta pregunta, aunque se me ha preguntado de manera diferente varias veces.

Quiero compartir una memoria entre dos procesos (dos aplicaciones diferentes), de modo que uno de ellos pueda escribir en esa memoria y el otro pueda leer.

¿Es esto posible en .NET? ¿Cómo?

Gracias

En este momento, .NET no admite secciones (también conocido como archivos mapeados de memoria). Pronto, la versión 4.0 tiene el espacio de nombres System.IO.MemoryMappedFiles. Hay una buena razón por la que tomó tanto tiempo y también la razón por la que no estará contento con esta adición. El uso de punteros es obligatorio en los archivos MMF, la memoria compartida está disponible en una dirección específica. Para compartir un valor, deberá escribirlo en una dirección específica.

Sin embargo, los indicadores son fundamentalmente incompatibles con el modelo de memoria administrada. Los objetos se crean en un montón recogido de basura, el recolector los mueve según sea necesario para mantener el montón compactado. En un lenguaje administrado, tiene una referencia a dicho objeto, también conocido como un “identificador de seguimiento”. El equivalente de C / C ++ es un puntero, pero es uno con campanas encendidas, el recolector de basura siempre puede encontrarlo y actualizar su valor. El CLR admite la noción de “fijación”, convierte una referencia a un puntero. Implementa esto al marcar el objeto como inamovible. Sin embargo, eso no ayuda a implementar la memoria compartida a través de un archivo MMF, el objeto está anclado en el montón de GC en lugar de la dirección de memoria virtual donde se encuentra la vista de MMF.

Para hacer funcionar un archivo MMF, el objeto debe ser copiado del montón del GC a la memoria compartida. Eso requiere serialización. La clase .NET 4.0 se llama MemoryMappedViewStream. Es probable que pueda ver a dónde va esto, esto es indistinguible de usar una tubería con nombre o un zócalo. Obtener datos dentro y fuera de un archivo MMF requiere el mismo esfuerzo. Un MMF es simplemente un poco más eficiente porque el búfer subyacente no está en el grupo de memoria del kernel.

Puedes romper las reglas y hacerlo hoy. Puede P / Invocar CreateFileMapping, OpenFileMapping y MapViewOfFile que necesita para crear un archivo MMF. Y use la palabra clave insegura para que pueda crear punteros. Tendrá que usar tipos de valor (como struct) para los elementos de memoria compartida o usar la clase Marshal.

IPC

Si está hablando de comunicación entre procesos. Hay varias posibilidades, como el uso de sockets tcp / udp, mailslots, pipes con nombre, archivos mapeados en memoria, mensajes de Windows, etc.

.Net también ofrece IPC de nivel superior como .Net remoting y WCF que utilizan las técnicas mencionadas anteriormente. Puedes leer más sobre esto aquí .

Archivos de memoria asignados

Si realmente desea compartir un bloque de memoria en lugar de comunicación, entonces tal vez los archivos mapeados en memoria sean los que desee. .Net 4.0 tiene MemoryMappedFile para eso. Si no usa .Net 4.0 o no puede hacerlo, puede implementarlo usted mismo como en este ejemplo de win32 . O puede probar este código o ver si puede usar MemoryMappedFileStream mencionado aquí y aquí . O use esta clase FileMap .

Use un tubo con nombre .

Es un mecanismo que permite que un proceso escriba datos secuenciales en una secuencia, desde la cual el otro proceso puede leer.

Tenga en cuenta que la tubería con nombre solo permite la lectura secuencial. Si necesita utilizar consultas más elaboradas, quizás desee utilizar la architecture cliente-servidor. En este caso, el proceso de lectura consulta el otro proceso para obtener información usando sockets de red .

Como ya se mencionó, use Archivos de memoria asignados. Implementación para .NET <4 disponible en: http://github.com/tomasr/filemap/
Lo he usado y funciona sin defectos. Puede tener algunos problemas de seguridad cuando se comparte entre procesos elevados / no elevados: la solución es inicializar el archivo mapeado en memoria en el proceso elevado y configurar sus atributos de seguridad en consecuencia.