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参数超出文件的长度时才会抛出错误(这与我们习惯使用的大小是最大值的流的行为不同,相反它似乎将参数作为文字和结果是尝试读取文件的末尾)。

我通过检查大小是否超过打开文件的大小来修复我的问题。