2013-06-08 17 views
8

Ho bisogno di accedere a un file di mappa di memoria condivisa (creato e posseduto da un programma separato); Per farlo sto usandoMantieni un MemoryMappedFile Alive dopo Dispose

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

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

Quando chiudo l'applicazione che chiamo smaltire su queste:

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

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

ma sembra che qualcosa che sto facendo qui è uccidere il file mappa della memoria, perché l'altro programma che utilizza questo inizia a ricevere errori di memoria protetta.

Se smaltire l'_map fa in realtà distrugge il file di memoria mappata, anche se non è ereditato la proprietà?

Aggiornamento

'venuto fuori l'altro programma, non sotto il mio controllo, stava facendo cose cattive dopo che avevo segnalato a go-to modalità IDLE (immediatamente prima di smaltire la mappa di memoria).

Quando si utilizza "MemoryMappedFile.OpenExisting" con "HandleInheritability.None", il file della mappa di memoria non verrà distrutto dopo lo smaltimento.

+0

No, disporre un MemoryMappedFile aperto chiamando 'OpenExisting()' non * distruggerà il MMF sottostante. Il processo che ha chiamato l'API di Windows 'CreateFileMapping()' controlla la durata del file MMF e 'OpenExisting()' chiama invece 'OpenFileMapping()'. –

+0

Faresti meglio a concentrarti sul contenuto di mmf e sugli oggetti di sincronizzazione necessari per rendere sicuro l'accesso a mmf. Il fatto che non sembri avere una tale sincronizzazione in atto è una bandiera rossa piuttosto grande. –

+0

Hai ragione, Hans, non era la mappa della memoria che rappresentava il problema, era semplicemente l'altro programma (non il mio) a fare cose cattive con un autista, dopo che avevo segnalato una modalità di inattività. –

risposta

2

No, lo smaltimento di un MemoryMappedFile aperto chiamando OpenExisting() non distruggerà il file MMF sottostante.

Il processo che ha chiamato l'API di Windows CreateFileMapping() controlla invece la durata del MMF e OpenExisting() chiama OpenFileMapping().

Problemi correlati