Question

Je sais que .NET 4.0 est en version bêta, mais j'espère que quelqu'un a une résolution à cet effet. Je suis en train de créer un fichier de mémoire mappée à partir d'une 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
    }
}

Malheureusement, peu importe ce que je fais, je reçois toujours un UnauthorizedAccessException, pour lequel le documentation MSDN indique:

  

Le système d'exploitation a refusé l'accès au fichier spécifié; par exemple, l'accès est mis à écrire ou ReadWrite, mais le fichier ou le répertoire est en lecture seule.

Je l'ai surveillé mon application avec Process Monitor Sysinternals, ce qui montre que le fichier est en effet en cours d'ouverture avec succès. J'ai aussi essayé la cartographie de la mémoire d'autres fichiers DLL non, mais avec le même résultat.

Était-ce utile?

La solution

Eh bien, j'ai un exemple basé sur ce qui précède, qui fonctionne sans exceptions. Je l'ai fait deux changements importants:

  • Je ne suis spécifié MemoryMappedFileAccess.Read lors de la création du MemoryMappedFile. Vous avez ouvert pour lecture, de sorte que vous ne pouvez lire. Je ne l'ai pas essayé le fixer pour permettre d'exécuter aussi bien en changeant la façon dont l'FileStream est ouvert.
  • Je l'ai fait l'appel CreateViewStream utiliser explicitement MemoryMappedFileAccess.Read ainsi. Je ne sais pas pourquoi il ne pas utiliser les droits d'accès existants par lui-même, mais nous allons.

Programme complet:

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
            }
        }
    }
}

Autres conseils

J'ai eu le même comportement lors de l'appel de la méthode CreateViewAccessor (...).

fin de compte, l'erreur n'a été levée lorsque le paramètre de taille a dépassé la longueur du fichier (ce n'est pas le même comportement que nous sommes habitués à des cours d'eau où la taille est une valeur maximale, il semble plutôt prendre le paramètre comme un littéral et le résultat est une tentative de lecture au-delà de la fin du fichier).

Je fixe mon problème en vérifiant que la taille ne dépasse pas la taille du fichier ouvert.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top