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.

War es hilfreich?

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 die MemoryMappedFile 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 die FileStream geöffnet wird.
  • Ich habe die CreateViewStream Aufruf explizit verwenden MemoryMappedFileAccess.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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top