MemoryMappedFile.CreateFromFile jette toujours UnauthorizedAccessException
-
21-09-2019 - |
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.
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 duMemoryMappedFile
. 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 explicitementMemoryMappedFileAccess.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.