2012-07-18 20 views
5

Próbuję zaimplementować plik mapowany w pamięci w mojej aplikacji (w szczególności usługę systemu Windows), a następnie użyć formularza C# do odczytu z usługi MMF, w której zapisuje serwis. Niestety nie mogę uzyskać formularza do odczytu czegokolwiek z FRP, co ważniejsze wydaje się, że formularz nigdy nie znajduje FRP utworzonej przez Serwis. Poniżej znajdują się fragmenty kodu, które pokazują, co robię, czy ktoś może zobaczyć, co robię źle, czy może wskazać mi lepszy kierunek?Rozwiązywanie problemów z pliku mapowanego z pamięcią

Usługa:

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(); 
} 

Postać:

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** 
      } 
     } 
    } 

Dodatkowo, podczas gdy usługa jest 'Running', MMF powinien zawsze mieć rączkę i nie powinno się zebrane przez śmieciarza;

+0

Więc, * nie * uzyskać FileNotFoundException? –

+0

Czy formularz exe znajduje się w tym samym katalogu, co usługa? Czasami domyślny katalog usługi to c: \ windows \ system32. Próbowałbym podać pełną ścieżkę do pliku, a nie względną ścieżkę, taką jak "AuditStream". –

+1

Co to jest konto, na którym uruchamiana jest usługa? – HABO

Odpowiedz

13

Usługa działa w innej sesji, słynnej "sesji 0". Obiekty systemu Windows znajdują się w obszarze nazw powiązanym z sesją procesu, więc formularz nie może zobaczyć obiektu utworzonego w sesji używanej przez usługę.

Musisz poprzedzić Global\ nazwą mmf, aby utworzyć i uzyskać dostęp do obiektu w globalnej przestrzeni nazw.

Więc w służbie:

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

iw postaci:

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

Dziękuję, że to zrobiliście !, teraz muszę po prostu zmagać się z błędem odmowy dostępu. – Zholen

+0

Chcę dodać dla każdego, kto ogląda ten post, aby nie zapomniał zrobić tego samego z twoim muteksem ("Global"), najprawdopodobniej natkniesz się na problem z dostępem, gdy zobaczysz strumień aby to naprawić, ale pozostawia to bardzo "otwarte": – Zholen

+8

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

Powiązane problemy