MemoryMappedFile.CreateFromFile始终抛出UnauthorizedAccessException
我意识到.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文档说明了这一点:
操作系统拒绝指定的文件访问权限; 例如,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 } } } }
调用CreateViewAccessor(…)方法时,我有相同的行为。
事实certificate,只有当size参数超出文件的长度时才会抛出错误(这与我们习惯使用的大小是最大值的流的行为不同,相反它似乎将参数作为文字和结果是尝试读取文件的末尾)。
我通过检查大小是否超过打开文件的大小来修复我的问题。