.net memory ipc pipe named-pipes

.net - Memoria compartida entre 2 procesos(aplicaciones)



memory ipc (5)

No puedo encontrar ninguna respuesta útil para esta pregunta, aunque se 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


Como ya se mencionó, utilice los archivos asignados de memoria. Implementación para .NET <4 disponible en: FileMap
Lo he usado y funciona impecable. Es posible que tenga algunos problemas de seguridad al compartir entre procesos elevados / no elevados: la solución es inicializar el archivo asignado en memoria en el proceso elevado y establecer sus atributos de seguridad en consecuencia.


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

Sin embargo, los punteros son fundamentalmente incompatibles con el modelo de memoria administrada. Los objetos se crean en un montón recolectado de basura, el recolector los mueve según sea necesario para mantener el montón compactado. En un lenguaje administrado, tiene una referencia a un objeto de este tipo, también conocido como un "identificador de seguimiento". El equivalente de C / C ++ es un puntero, pero es uno con las campanas activadas, el recolector de basura siempre puede encontrarlo de nuevo y actualizar su valor. El CLR admite la noción de "anclaje", convierte una referencia a un puntero. Implementa esto marcando el objeto como inamovible. Sin embargo, eso no ayuda a implementar la memoria compartida a través de un archivo MMF, el objeto se ancla en el montón del GC en lugar de la dirección de memoria virtual donde se encuentra la vista MMF.

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

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



Utilice una tubería 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, es posible que desee utilizar la arquitectura cliente-servidor. En este caso, el proceso del lector consulta el otro proceso para obtener información mediante sockets de red .


IPC

Si estás hablando de Inter Process Communication. Hay varias posibilidades, como el uso de sockets tcp / udp, slots de correo, canalizaciones con nombre, archivos de memoria asignados, mensajes de Windows, etc.

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

Archivos asignados en memoria

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