MemoryMappedFile.CreateFromFile wirft immer UnauthorizedAccessException
-
21-09-2019 - |
Frage
Ich weiß, .NET 4.0 in der Beta ist, aber ich bin der Hoffnung, jemand eine Lösung für diese hat. Ich versuche, ein Memory-Mapped-Datei aus einer DLL zu erstellen:
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
}
}
Leider, egal, was ich tue, habe ich immer einen UnauthorizedAccessException
bekommen, für die die MSDN-Dokumentation heißt es:
Das Betriebssystem verweigert den angegebenen Zugriff auf die Datei; beispielsweise der Zugriff auf Schreib- oder Lese-Schreib gesetzt, aber die Datei oder das Verzeichnis ist schreibgeschützt.
Ich habe meine Anwendung mit Sysinternals Process Monitor überwacht, die zeigen, dass die Datei in der Tat erfolgreich geöffnet wird. Ich habe auch Speicherzuordnung andere nicht-DLL-Dateien versucht, aber mit dem gleichen Ergebnis.
Lösung
Nun habe ich ein Beispiel bekam auf der Grundlage der oben denen ohne Ausnahmen ausgeführt wird. Ich habe zwei wichtige Änderungen vorgenommen:
- Ich
MemoryMappedFileAccess.Read
nur angegeben werden, wenn dieMemoryMappedFile
zu schaffen. Sie haben es bis zum Lesen geöffnet, so können Sie nur lesen. Ich habe nicht versucht, es zu reparieren und zu ermöglichen, auszuführen, indem, wie dieFileStream
geöffnet wird. - Ich habe die
CreateViewStream
Aufruf explizit verwendenMemoryMappedFileAccess.Read
als gut gemacht. Ich bin mir nicht sicher, warum es nicht die bestehenden Zugriffsrechte selbst nicht verwendet, aber es uns gehen.
Volles Programm:
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
}
}
}
}
Andere Tipps
Ich hatte das gleiche Verhalten, wenn die CreateViewAccessor Aufruf (...) Methode.
Es stellte sich heraus, wurde der Fehler nur ausgelöst, wenn die Größe Parameter, um die Länge der Datei überschritten (es ist nicht das gleiche Verhalten wie wir mit Strömen gewohnt sind, wo Größe ein Maximalwert ist, stattdessen scheint es, den Parameter zu nehmen, wie ein wörtliche und das Ergebnis ist ein Versuch, über das Ende der Datei zu lesen).
Ich reparierte mein Problem durch Überprüfen, dass die Größe nicht die Größe der geöffneten Datei nicht überschreitet.