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.
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()'. –
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. –
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à. –