MemoryMappedFile.CreateFromFile は常に UnauthorizedAccessException をスローします
-
21-09-2019 - |
質問
.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
}
}
残念ながら、何をしても、常に次のような結果が得られます。 UnauthorizedAccessException
, 、そのために、 MSDN ドキュメント 状態:
オペレーティング システムは、ファイルへの指定されたアクセスを拒否しました。たとえば、アクセスは書き込みまたは読み取り書き込みに設定されていますが、ファイルまたはディレクトリは読み取り専用です。
Sysinternals Process Monitor を使用してアプリケーションを監視したところ、ファイルが実際に正常に開かれていることがわかりました。他の非DLLファイルのメモリマッピングも試みましたが、結果は同じでした。
解決
さて、上記に基づいて、例外なく実行される例があります。次の 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
}
}
}
}
他のヒント
CreateViewAccessor(...)メソッドを呼び出すときに、私は同じ動作を持っています。
が判明サイズパラメータは、ファイルの長さを超えると、エラーがだけスローされた(それは我々がサイズが最大値であるストリームとに慣れているのと同じ動作ではありません、代わりに、などのパラメータを取るように見えますリテラル結果)は、ファイルの終わりを超えて読み取るための試みです。
私はサイズが開いているファイルのサイズを超えていないことを確認することで、私の問題を修正します。
所属していません StackOverflow