MemoryMappedFile.CreateFromFile始终抛出UnauthorizedAccessException

Dav*_*own 2 .net c# .net-4.0 memory-mapped-files

我意识到.NET 4.0处于测试阶段,但我希望有人能够解决这个问题.我正在尝试从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
    }
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,无论我做什么,我总是得到一个UnauthorizedAccessException,MSDN文档说明:

操作系统拒绝对文件的指定访问权限; 例如,access设置为Write或ReadWrite,但文件或目录是只读的.

我用Sysinternals Process Monitor监视我的应用程序,它显示该文件确实正在成功打开.我也尝试过映射其他非DLL文件的内存,但结果相同.

Jon*_*eet 8

好吧,我有一个基于上面的例子,没有例外.我做了两个重要的改变:

  • 我只MemoryMappedFileAccess.Read在创建时指定MemoryMappedFile.你打开它进行阅读,所以你只能阅读.我没有尝试通过改变FileStream打开方式来修复它以允许执行.
  • 我也CreateViewStream明确地使用了这个电话MemoryMappedFileAccess.Read.我不确定为什么它本身不使用现有的访问权限,但我们去了.

完整计划:

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
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


Nat*_*han 6

调用CreateViewAccessor(...)方法时,我有相同的行为.

事实证明,只有当size参数超出文件的长度时才会抛出错误(这与我们习惯使用的大小是最大值的流的行为不同,相反它似乎将参数作为文字和结果是尝试读取文件的末尾).

我通过检查大小是否超过打开文件的大小来解决我的问题.