メモリマップドファイルの文字列書き込みについて

解決


youta  2013-10-07 10:08:26  No: 148229  IP: [192.*.*.*]

メモリマップドファイルを使用してプロセス間で文字列の受け渡しを
行いたいのですが、メモリへの書き込みがうまくいかずに困っています。

開発環境
Windows7 Professional SP1
Visual Studio 2010 Professional

以下、書き込み処理部分

Dim str as String = "sample"
Dim bytdat As Byte() = System.Text.Encoding.Unicode.GetBytes(str)
Using mmf As MemoryMappedFile = MemoryMappedFile.CreateOrOpen("MMF", 128)
  Using accessor As MemoryMappedViewAccessor = mmf.CreateViewAccessor
      accessor.WriteArray(Of Byte)(0, bytdat, 0, bytdat.Length)
  End Using
End Using

書き込んだ(つもり)メモリからデータを読み込むとNULLが返ってきます。
ソースの記述に間違いがあればご指摘願います。

どうかご教授の程、宜しくお願い致します。

編集 削除
shu  2013-10-07 15:28:00  No: 148230  IP: [192.*.*.*]

非永続化なのでDisposeで内容がクリアされてしまいます。
Disposeはすべての箇所で使い終わったところで行うようにする必要があります。
http://msdn.microsoft.com/ja-jp/library/vstudio/dd997372.aspx

例)
Imports System.IO.MemoryMappedFiles
Imports System.Text

Public Class Form1

    Private mmf As MemoryMappedFile = Nothing

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        If mmf Is Nothing Then
            mmf = MemoryMappedFile.CreateOrOpen("MMF", 128)
        End If
        Dim bytDat = Encoding.UTF8.GetBytes(TextBox1.Text)
        Using acc = mmf.CreateViewAccessor()
            acc.Write(0, bytDat.Length)
            acc.WriteArray(Of Byte)(4, bytDat, 0, bytDat.Length)
        End Using
    End Sub

    Private Sub Button2_Click(sender As Object, e As System.EventArgs) Handles Button2.Click
        If mmf Is Nothing Then
            mmf = MemoryMappedFile.CreateOrOpen("MMF", 128)
        End If
        Using acc = mmf.CreateViewAccessor()
            Dim leng = acc.ReadInt32(0)
            Dim bytDat(leng - 1) As Byte
            acc.ReadArray(Of Byte)(4, bytDat, 0, leng)
            TextBox2.Text = Encoding.UTF8.GetString(bytDat)
        End Using
    End Sub

    Private Sub Button3_Click(sender As Object, e As System.EventArgs) Handles Button3.Click
        If mmf IsNot Nothing Then
            mmf.Dispose()
            mmf = Nothing
        End If
    End Sub
End Class

編集 削除
youta  2013-10-07 17:13:49  No: 148231  IP: [192.*.*.*]

shu様

早々のご回答ありがとうございます。

shu様の書き込み処理のソースをコピーしたらすんなりいけました。
明日、自分のソースとの違いを精査しようと思います。

編集 削除
youta  2013-10-08 09:13:25  No: 148232  IP: [192.*.*.*]

解決致しました。

MemoryMappedFileの宣言の際にUsingを使用していたのが、
原因だったようです。

End UsingのタイミングでDisposeするようですね。

shu様、この度は本当にありがとうございました。
助かりました。

編集 削除