Domanda

Mi rendo conto NET 4.0 è in beta, ma sto sperando che qualcuno ha una soluzione per questo. Sto cercando di creare un file mappato di memoria da una 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
    }
}

Purtroppo, non importa quello che faccio, ho sempre arrivare un UnauthorizedAccessException, per il quale la documentazione MSDN afferma:

  

Il sistema operativo ha negato l'accesso specificato al file; per esempio, l'accesso è impostato su Scrivere o ReadWrite, ma il file o la directory è di sola lettura.

Ho monitorato la mia applicazione con Monitor Sysinternals Process, il che dimostra che il file è infatti viene aperto con successo. Ho anche provato la mappatura della memoria di altri file non DLL, ma con lo stesso risultato.

È stato utile?

Soluzione

Bene, ho un esempio base di quanto sopra, che funziona senza eccezioni. Ho fatto due importanti modifiche:

  • Sto specificato solo MemoryMappedFileAccess.Read durante la creazione del MemoryMappedFile. Hai aperto in lettura, in modo da poter sola lettura. Non ho provato fissandola per consentire l'esecuzione così cambiando il modo si apre il FileStream.
  • Ho fatto la chiamata CreateViewStream esplicitamente utilizzare MemoryMappedFileAccess.Read pure. Io non sono sicuro perché non utilizza i diritti di accesso esistenti di per sé, ma ci andiamo.

Programma completo:

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

Altri suggerimenti

ho avuto lo stesso comportamento quando si chiama il metodo CreateViewAccessor (...).

Si scopre che l'errore è stato gettato solo quando il parametro di dimensione ha superato la lunghezza del file (non è lo stesso comportamento come siamo abituati a con i flussi in cui dimensione è un valore massimo, invece sembra prendere il parametro come un letterale e il risultato è un tentativo di leggere oltre la fine del file).

Ho risolto il mio problema controllando che la dimensione non superi la dimensione del file aperto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top