MemoryMappedFile.CreateFromFile始终抛出UnauthorizedAccessException

时间:2009-10-15 06:33:00

标签: c# .net .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
    }
}

不幸的是,无论我做什么,我总是得到UnauthorizedAccessException MSDN documentation状态:

  

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

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

2 个答案:

答案 0 :(得分: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
            }
        }
    }
}

答案 1 :(得分:6)

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

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

我通过检查大小是否超过打开文件的大小来修复我的问题。