2

我意识到.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
    }
}

不幸的是,无论我做什么,我总是得到一个UnauthorizedAccessExceptionMSDN 文档指出:

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

我已经使用 Sysinternals Process Monitor 监控了我的应用程序,这表明该文件确实已成功打开。我也尝试过内存映射其他非 DLL 文件,但结果相同。

4

2 回答 2

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
            }
        }
    }
}
于 2009-10-15T06:53:12.353 回答
7

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

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

我通过检查大小不超过打开文件的大小来解决我的问题。

于 2011-03-31T14:18:10.903 回答