我意识到。净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文件 国家:

操作系统剥夺指定的访问的文件;例如,访问设置,以写入或者读写,但是该文件的目录或是只读的。

我已经监视我的应用程序与微软过程监视器,这显示出该文件的确被打开的成功。我也试过存储器的映射的其他非DLL文件,但具有相同的结果。

有帮助吗?

解决方案

嗯,我有一个例子基于上述其运行,而不例外。我做了两个重要变化:

  • 我只是规定 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
            }
        }
    }
}

其他提示

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

原来,当尺寸参数超过了文件的长度(这是不一样的行为,我们已经习惯了与在规模最大的价值流,而不是它似乎把参数作为错误才被抛出文字,其结果是读取过去的文件的结束)的尝试。

我通过检查大小不超过打开的文件的大小固定我的问题。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top