2009-10-15 5 views
1

Je réalise que .NET 4.0 est en version bêta, mais j'espère que quelqu'un aura une solution pour cela. Je suis en train de créer une mémoire fichier mis en correspondance à partir d'une DLL:MemoryMappedFile.CreateFromFile lance toujours UnauthorizedAccessException

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, dont les MSDN documentation états:

Le système d'exploitation refusé l'accès spécifié au fichier; Par exemple, l'accès est défini sur Write ou ReadWrite, mais le fichier ou le répertoire est en lecture seule.

J'ai surveillé mon application avec Sysinternals Process Monitor, qui montre que le fichier est effectivement ouvert avec succès. J'ai également essayé le mappage de la mémoire d'autres fichiers non-DLL, mais avec le même résultat.

+0

Cela semble être un doublon: http://stackoverflow.com/questions/1220913/unauthorizedaccessexception-on-memorymappedfile-in-c-4 – bobbymcr

Répondre

8

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

  • Je ne MemoryMappedFileAccess.Read spécifié lors de la création du MemoryMappedFile. Vous l'avez ouvert pour la lecture, ainsi vous pouvez seulement lire. Je n'ai pas essayé de le réparer pour permettre l'exécution aussi bien en changeant comment le FileStream est ouvert.
  • J'ai fait l'appel CreateViewStream également utiliser explicitement MemoryMappedFileAccess.Read. Je ne suis pas sûr pourquoi il n'utilise pas les droits d'accès existants par lui-même, mais c'est parti.

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

Ce code fonctionne également pour moi. Cependant, ce que j'essaye de faire est de charger la DLL en mémoire comme si elle était sur le point d'être exécutée, donc je peux éviter de faire tout le mappage de la section PE moi-même en lisant la table d'export de la DLL. Pour cela, j'ai besoin de mapper le fichier avec l'accès ReadExecute. Mais il ne semble pas y avoir un attribut FileAccess.ReadExecute correspondant ou même un indicateur FileAccess.Execute pour FileStream.Open(). –

+0

Droite. Je vais voir ce que je peux faire, mais je pense qu'il y a une certaine distance entre "je ne peux pas l'utiliser dans ce but" et "c'est complètement inutilisable" :) –

+0

En effet. Peut-être que j'étais un peu dur à cet égard. En fait, à l'époque, je ne me suis pas rendu compte qu'il y avait une différence entre la façon dont un fichier est ouvert pour l'accès en lecture et pour l'accès ReadExecute. Je pensais que c'était simplement une question de comment le fichier a été traité ** après ** être ouvert. Merci pour ton aide au passage! –

6

J'ai eu le même comportement lors de l'appel de la méthode CreateViewAccessor (...). Il s'avère que l'erreur n'a été levée que lorsque le paramètre size a dépassé la longueur du fichier (ce n'est pas le même comportement que pour les flux dont 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 après la fin du fichier).

J'ai corrigé mon problème en vérifiant que la taille n'excède pas la taille du fichier ouvert.

+0

J'ai eu le même problème. –

+0

Dans .NET 4.5.2, cette exception trompeuse est toujours levée. – fero

Questions connexes