MemoryMappedFile.CreateFromFile总是抛出UnauthorizedAccessException
-
21-09-2019 - |
题
我意识到。净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时具有相同的行为(...)方法
原来,当尺寸参数超过了文件的长度(这是不一样的行为,我们已经习惯了与在规模最大的价值流,而不是它似乎把参数作为错误才被抛出文字,其结果是读取过去的文件的结束)的尝试。
我通过检查大小不超过打开的文件的大小固定我的问题。
不隶属于 StackOverflow