2011-10-18 21 views
5

Necesito mi Servicio para actualizar campos en la memoria compartida para que una aplicación cliente los lea y muestre. He encontrado que mi solución actual es ineficaz debido a Session 0 Isolation.Compartir la memoria entre el servicio de Windows y la aplicación, ¿qué es más fácil?

He cambiado el nombre del mutex es en el espacio de nombres global que fija ese elemento, pero no se ve como si el DLL será susceptible de intercambio de información entre sesiones a pesar de una solución a la sesión 0 Aislamiento ser:

"Elija explícitamente el espacio de nombres Local \ o Global \ para cualquier objeto con nombre, como los eventos o la memoria mapeada que el servicio pone a disposición."

No sé qué parte de la dll se puede clasificar como un objeto con nombre y tardará demasiado tiempo en volver a instalarla y recorrerla para comprobar.

Vi los volúmenes de código para los canales con nombre y se suspendió. No quiero crear un archivo que toque el disco, como supongo que se requiere de la solución memoryMappedFile. ¿Se pueden hacer funcionar las secciones compartidas de dlls? De lo contrario, ¿qué es más fácil?

public ref class ServerGUIBridge 
{ 
public: 
#pragma data_seg(".sdata") 
    static int commonIntShouldBeGlobal = 0; 
    static bool hasBeenInitializedMakeMeGlobal = false; 
#pragma data_seg() 
#pragma comment(linker, "/section:.sdata,rws") 

Estoy usando .NET 2.0 así que no WCF por favor.

+0

Si crea el archivo mapeado en memoria con INVALID_FILE_HANDLE, entonces no se crea ningún archivo. Es solo memoria que se desplaza cuando no se accede por un tiempo. Tenga en cuenta que las secciones compartidas son un agujero de seguridad; no puede poner ACL en una sección compartida. (¿Qué sucede si un cliente entra y hace 'hasBeenInitializedMakeMeGlobal = false' o' commonIntShouldBeGlobal = rand() '?) –

+0

@Raymond" Si hFile es INVALID_HANDLE_VALUE, el proceso de llamada también debe especificar un tamaño para el objeto de mapeo de archivos en dwMaximumSizeHigh y los parámetros dwMaximumSizeLow. En este escenario, CreateFileMapping crea un objeto de asignación de archivos de un tamaño específico que está respaldado por el archivo de paginación del sistema en lugar de por un archivo en el sistema de archivos. " - Entonces, ¿dónde está respaldado si el archivo de paginación del sistema está desactivado? – John

+1

"Respaldado por el archivo de paginación del sistema" es una redacción pobre. Realmente debería ser "respaldado por el sistema de memoria virtual". Si el archivo de paginación está deshabilitado, entonces el sistema de memoria virtual es solo memoria física. –

Respuesta

0

Un método a menudo pasado por alto de IPC es escribir en el registro. Para los dos miembros de POD que propongo compartir, esta sería la solución ideal. IPC, MSDN, and the registry

0

Todas las versiones de .NET Framework tienen la función Remoting. Permite invocar métodos en otro dominio de aplicación que puede estar en procesos separados. Consulte MSDN para ejemplos y uso: http://msdn.microsoft.com/en-us/library/kwdt6w2k(v=VS.80).aspx

+0

Realmente debería saber acerca de Remoting. Un día. Se trata más bien de una sobrecarga en lo que respecta a la comunicación entre computadoras. – John

+0

Remoting está disponible pero se considera obsoleto para versiones .NET más nuevas, reemplazadas por las WCF mucho más flexibles (¿y complejas?). –

1

Sugeriría tuberías con nombre: entonces tiene un aislamiento controlado adecuado entre los dos procesos. Compartir archivos DLL parece estar lleno de peligros.

Las canalizaciones con nombre se documentan en MSDN aquí: http://msdn.microsoft.com/en-us/library/aa365590.aspx

y una utilidad artículo busca .NET 2.0 está aquí: http://www.switchonthecode.com/tutorials/interprocess-communication-using-named-pipes-in-csharp

(Tenga en cuenta que .NET 3.5 y anteriores tiene una clase NetNamedPipeBinding [http://msdn.microsoft.com/en-us/library/system.servicemodel.netnamedpipebinding.aspx] eso es parte de WCF)

+0

Una vez intenté compartir canalizaciones con nombre entre un proceso elevado y uno normal y no fue posible. ¿Hay algún parámetro especial que deba establecerse? – RedX

Cuestiones relacionadas