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文件的内存,但结果相同.
好吧,我有一个基于上面的例子,没有例外.我做了两个重要的改变:
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)
调用CreateViewAccessor(...)方法时,我有相同的行为.
事实证明,只有当size参数超出文件的长度时才会抛出错误(这与我们习惯使用的大小是最大值的流的行为不同,相反它似乎将参数作为文字和结果是尝试读取文件的末尾).
我通过检查大小是否超过打开文件的大小来解决我的问题.