2012-07-18 11 views
5

Ich versuche, eine Memory Mapped File in meiner Anwendung (speziell ein Windows-Dienst) zu implementieren, und verwenden Sie dann ein C# -Formular aus MMF lesen den Dienst schreibt. Leider kann ich nicht das Formular lesen, um etwas aus dem MMF zu lesen, noch wichtiger scheint es, dass das Formular nie das MMF findet, das vom Dienst erstellt wird. Im Folgenden sind Code-Snippets, die skizzieren, was ich mache, kann jemand sehen, was ich falsch mache oder in der Lage sein, mich in eine bessere Richtung zu zeigen?Fehler beim Lesen von Memory Mapped Datei

Service:

private MemoryMappedFile mmf = MemoryMappedFile.CreateOrOpen("AuditStream", 1024 * 1024); 
private Mutex mutex = new Mutex(false, "MyMutex"); 

byte[] msg = new byte[1]; 
var view = mmf.CreateViewStream(0, 1); 
byte[] rmsg = new byte[1]; 

for (int i = 0; i < 400; i++) 
{ 
    mutex.WaitOne(); 
    for (int j = 0; j < msg.Length; j++) 
    { 
      msg[j] = (byte)i; 
    } 

    view.Position = 0; 
    view.Write(msg, 0, bufferSize); 

    //the next 3 lines verify that i wrote to the mmf and can potentially read from it 
    //These are just for testing 
    view.Position = 0; 
    view.Read(rmsg, 0, 1); 
    Log.Error("Finished MMF", rmsg[0].ToString()); 

    mutex.ReleaseMutex(); 
} 

Form:

private MemoryMappedFile mmf; 
private Mutex mutex; 
Thread t = new Thread(MmfMonitor); 
t.Start(); 

private void MmfMonitor() 
    { 

     byte[] message = new byte[1]; 
     while(!quit) 
     { 
      try 
      { 
       **mmf = MemoryMappedFile.OpenExisting("AuditStream");** 
       mutex = Mutex.OpenExisting("MyMutex"); 
       var view = mmf.CreateViewStream(0, 1); 

       mutex.WaitOne(); 
       view.Position = 0; 
       view.Read(message, 0, 1); 
       Invoke(new UpdateLabelCallback(UpdateLabel), message[0].ToString()); 
       mutex.ReleaseMutex(); 
      }catch(FileNotFoundException) 
      { 
       **//The AuditStream MMF is never found, and therefore doesnt every see the proper values** 
      } 
     } 
    } 

Zusätzlich, während der Dienst 'Running', die MMF sollte immer einen Griff haben und sollten nicht vom Garbage Collector gesammelt erhalten;

+0

Also, Sie * Sie * die FileNotFoundException bekommen? –

+0

Ist die Form exe im selben Verzeichnis wie der Dienst? Manchmal ist das Standardverzeichnis des Dienstes c: \ windows \ system32. Ich würde versuchen, den vollständigen Pfad der Datei anzugeben, keinen relativen Pfad wie "AuditStream". –

+1

Unter welchem ​​Konto wird der Dienst ausgeführt? – HABO

Antwort

13

Der Dienst läuft in einer anderen Sitzung, der berühmten "Sitzung 0". Windows-Objekte befinden sich in einem Namespace, der der Sitzung des Prozesses zugeordnet ist, sodass Ihr Formular das in der vom Dienst verwendeten Sitzung erstellte Objekt nicht sehen kann.

Sie müssen Global\ dem mmf-Namen voranstellen, um das Objekt im globalen Namespace zu erstellen und darauf zuzugreifen.

So im Dienst:

mmf = MemoryMappedFile.CreateOrOpen(@"Global\AuditStream", ...) 

und in der Form:

mmf = MemoryMappedFile.OpenExisting(@"Global\AuditStream"); 
+0

Danke, dass es geschafft hat !, Jetzt muss ich nur noch mit einem Zugriff verweigert-Fehler ringen. – Zholen

+0

Ich möchte für alle anderen, die diesen Beitrag anzeigen, hinzufügen, um nicht zu vergessen, das gleiche mit Ihrem Mutex ("Global") auch zu tun, Sie werden höchstwahrscheinlich auf ein Zugriffsproblem stoßen, sobald Sie den folgenden Stream sehen können um es zu beheben, obwohl es es sehr offen lässt: – Zholen

+8

var security = new MemoryMappedFileSecurity(); security.AddAccessRule (neue AccessRule ("alle", MemoryMappedFileRights.FullControl, AccessControlType.Allow)); mmf = MemoryMappedFile.CreateOrOpen (@ "Global \ AmToteAuditStream", 1024 * 1024, MemoryMappedFileAccess.ReadWrite, MemoryMappedFileOptions.DelayAllocatePages, Sicherheit, HandleInheritability.Inheritable); – Zholen