2

.NET 4.0はベータ版であることに気付きましたが、誰かがこれに対する解決策を持っていることを望んでいます。DLLからメモリマップトファイルを作成しようとしています。

FileStream file = File.OpenRead("C:\mydll.dll");
using (MemoryMappedFile mappedFile = MemoryMappedFile.CreateFromFile(file,
    "PEIMAGE", 1024 * 1024, MemoryMappedFileAccess.ReadExecute))
{
    using (MemoryMappedViewStream viewStream = mappedFile.CreateViewStream())
    {
        // read from the view stream
    }
}

残念ながら、私が何をしてもUnauthorizedAccessExceptionMSDNのドキュメントに次のように記載されているが常に表示されます。

オペレーティングシステムは、ファイルへの指定されたアクセスを拒否しました。たとえば、アクセスはWriteまたはReadWriteに設定されていますが、ファイルまたはディレクトリは読み取り専用です。

Sysinternals Process Monitorを使用してアプリケーションを監視しました。これは、ファイルが実際に正常に開かれていることを示しています。他の非DLLファイルのメモリマッピングも試しましたが、同じ結果になりました。

4

2 に答える 2

8

さて、私は例外なく実行される上記に基づいた例を持っています。2つの重要な変更を加えました。

  • MemoryMappedFileAccess.Readを作成するときにのみ指定されますMemoryMappedFile。あなたはそれを読むために開いたので、あなたは読むことしかできません。FileStreamを開く方法を変更して実行できるように修正しようとはしていません。
  • 私もCreateViewStream明示的に使用して呼び出しを行いましMemoryMappedFileAccess.Readた。なぜそれ自体が既存のアクセス権を使用しないのかはわかりませんが、そこに行きます。

完全なプログラム:

using System.IO;
using System.IO.MemoryMappedFiles;

class Test
{
    static void Main()
    {
        FileStream file = File.OpenRead("Test.cs");
        using (MemoryMappedFile mappedFile = MemoryMappedFile.CreateFromFile
               (file, "PEIMAGE", file.Length, MemoryMappedFileAccess.Read, null, 0, false))
        {
            using (var viewStream = mappedFile.CreateViewStream
                   (0, file.Length, MemoryMappedFileAccess.Read))
            {
                // read from the view stream
            }
        }
    }
}
于 2009-10-15T06:53:12.353 に答える
7

CreateViewAccessor(...)メソッドを呼び出したときも同じ動作をしました。

結局のところ、エラーはサイズパラメータがファイルの長さを超えた場合にのみスローされました(サイズが最大値であるストリームで使用されているのと同じ動作ではなく、パラメータをリテラルとして受け取り、その結果、ファイルの終わりを超えて読み取ろうとします)。

サイズが開いているファイルのサイズを超えていないことを確認して、問題を修正しました。

于 2011-03-31T14:18:10.903 に答える