2013-06-08 135 views
8

共有メモリマップファイルにアクセスする必要があります(別のプログラムによって作成され、所有されています)。私はこれらに処分呼び出すアプリケーション閉じると私はDispose後にMemoryMappedFileを有効にしたままにする

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

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

を使用しています実行します。

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

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

をしかし、それは私がここでやっている何かのように思えるのメモリ・マップ・ファイルをオフに殺害され、これを使用する他のプログラムが保護されたメモリフォールトを取得し始めるからです。

私が_mapを処分した場合、所有権を継承していないにもかかわらず実際にメモリマップされたファイルが破壊されますか?

更新

私が行く-するために(すぐにメモリマップを配置する前に)モードをアイドルそれを合図した後に私のコントロールの下で、いたずらな事をやっていたではない、他のプログラムをオンにします。

'MemoryMappedFile.OpenExisting'と 'HandleInheritability.None'を併用すると、メモリマップファイルは破棄されません。

+0

いいえ、 'OpenExisting()'を呼び出すことによって開いたMemoryMappedFileを破棄すると、基礎となるMMFは破棄されません。 Windows APIの 'CreateFileMapping()'を呼び出したプロセスは、MMFの有効期間を制御し、 'OpenExisting()'は代わりに 'OpenFileMapping()'を呼び出します。 –

+0

mmfの安全性にアクセスするのに必要なmmfと同期オブジェクトの内容に焦点を当てることをお勧めします。そのような同期がないように思われるのはかなり大きいRed Flag btwです。 –

+0

あなたは正しいハンスです、それは問題であったメモリマップではありませんでした。私がアイドルモードに移行したことを知らせた後、それは単に他のプログラム(私ではない) –

答えて

2

いいえ、OpenExisting()を呼び出して開いたMemoryMappedFileを破棄しても、基になるMMFは破棄されません。

Windows API CreateFileMapping()を呼び出したプロセスは、MMFの寿命を制御し、OpenExisting()は代わりにOpenFileMapping()を呼び出します。

関連する問題