我意识到.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文件的内存,但结果相同。
答案 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参数超出文件的长度时才会抛出错误(这与我们习惯使用的大小是最大值的流的行为不同,相反它似乎将参数视为一个文字,结果是试图读取文件的结尾。)
我通过检查大小是否超过打开文件的大小来修复我的问题。