En este momento, .NET no admite secciones (también conocido como archivos asignados 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 punteros 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 que un archivo MMF funcione, el objeto debe copiarse 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.
Puede 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.
duplicado: http://stackoverflow.com/questions/439787/how-to-implement-shared-memory-in-net –
pero no hay una buena respuesta en esa pregunta duplicada también –
Hay buenas respuestas en la pregunta duplicada. Simplemente no les gusta lo que dicen. Pero no hay una forma integrada de compartir memoria en .NET, puede usar P-Invoke o probar con otro IPC. – Niki