2013-06-08 14 views
8

Potrzebuję uzyskać dostęp do pliku mapy pamięci współużytkowanej (utworzonego i posiadanego przez oddzielny program); W tym celu używamZachowaj MemoryMappedFile Alive po usunięciu

_map = MemoryMappedFile.OpenExisting(
      "buffer", 
      MemoryMappedFileRights.ReadWrite, 
      HandleInheritability.None); 

_mapAccessor = _map.CreateViewAccessor(0, 0, MemoryMappedFileAccess.ReadWrite); 

Kiedy zamknąć aplikację nazywam wyrzucać na nich:

public void Dispose() 
{ 
    if (_mapAccessor != null) 
     _mapAccessor.Dispose(); 

    if (_map != null) 
     _map.Dispose(); 
} 

ale wydaje się, że coś robię tu zabija się plik mapa pamięci, ponieważ inny program, który używa tego, zaczyna otrzymywać chronione błędy pamięci.

Jeśli usuwam plik _map, to faktycznie niszczy plik zmapowany w pamięci, mimo że nie jest odziedziczonym właścicielem?

Aktualizacja

Okazuje się, że inny program, a nie pod moją kontrolą, robił niegrzeczne rzeczy po tym jak zasygnalizował, że aby przejść do trybu gotowości (bezpośrednio przed wyrzuceniem mapę pamięci).

Podczas używania "MemoryMappedFile.OpenExisting" z "HandleInheritability.None" plik mapy pamięci nie zostanie zniszczony po utylizacji.

+0

Nie, unieszkodliwienie pliku MemoryMappedFile, wywoływanego przez 'OpenExisting()' nie * nie * spowoduje zniszczenia podstawowego FRP. Proces, który nazywał interfejs API Windows 'CreateFileMapping()' steruje czasem życia MMF i 'OpenExisting()' wywołuje 'OpenFileMapping()'. –

+0

Lepiej skup się na zawartości mmf i wymaganych obiektach synchronizacji, które umożliwiają dostęp do sejfu mmf. Wydaje się, że nie ma takiej synchronizacji w miejscu, to dość duża Red Flag btw. –

+0

Masz rację Hans, to nie była mapa pamięci, która była problemem, to był po prostu inny program (nie mój) robienie niegrzecznych rzeczy z kierowcą, po tym, jak zasygnalizowałem przejście w tryb jałowy. –

Odpowiedz

2

Nie, unieszkodliwienie pliku MemoryMappedFile otwieranego przez wywołanie metody OpenExisting() nie spowoduje zniszczenia podstawowego FRP.

Proces, który wywołał funkcję Windows API CreateFileMapping(), steruje czasem życia funkcji MMF i OpenExisting() w zamian wywołuje funkcję OpenFileMapping().

Powiązane problemy