9

共有メモリ マップ ファイル (別のプログラムによって作成および所有されている) にアクセスする必要があります。そうするために私は使用しています

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

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

アプリケーションを閉じるとき、これらに対して dispose を呼び出します。

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

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

しかし、これを使用する他のプログラムが保護されたメモリ障害を取得し始めるため、ここで行っていることはメモリマップファイルを強制終了しているようです。

破棄_mapすると、所有権が継承されていなくても、実際にメモリマップファイルが破棄されますか?

アップデート

私の制御下にない他のプログラムは、アイドルモードに移行するように通知した後(メモリマップを破棄する直前)、いたずらをしていたことが判明しました。

「MemoryMappedFile.OpenExisting」を「HandleInheritability.None」とともに使用すると、メモリ マップ ファイルは破棄後に破棄されません。

4

1 に答える 1

3

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

Windows API CreateFileMapping() を呼び出したプロセスが MMF の有効期間を制御し、代わりに OpenExisting() が OpenFileMapping() を呼び出します。

于 2013-07-24T14:13:59.603 に答える