【问题标题】:c# - MemoryMappedFile , what MemoryMappedFileAccess.ReadExecute do or when should i use it?c# - MemoryMappedFile,MemoryMappedFileAccess.ReadExecute 做什么或者我应该什么时候使用它?
【发布时间】:2019-12-05 06:43:05
【问题描述】:

我学习了一些关于MemoryMappedFile 的基础知识,我看到有一个enum 成员叫MemoryMappedFileAccess.ReadExcute

我认为这意味着当你打开一个 exe 文件时,它(我的程序)会执行它(.exe 文件)并读取其中的字节(.exe 文件)但是当我执行程序时它会抛出一个错误:

访问路径被拒绝 [UnauthorizedAccessException]

我的代码:

 static void Main(string[] args)
    {
        FileStream fs = new FileStream("programe.exe", FileMode.OpenOrCreate, FileAccess.ReadWrite, 
FileShare.ReadWrite);


        MemoryMappedFile memory = MemoryMappedFile.CreateFromFile(fs, "mapname", 0, 
MemoryMappedFileAccess.ReadExecute,null,0,false);



        MemoryMappedViewAccessor mmr = memory.CreateViewAccessor(0, fs.Length, MemoryMappedFileAccess.Read);






        Console.ReadKey();
    }

谁能给我解释一下?

【问题讨论】:

  • @jdweng 好的,我该怎么做才能解决异常
  • @CaiusJard 是的,我已经读过了,好吧 Read 和 ReadExcecute 有什么区别??

标签: c# memory-mapped-files memory-mapping


【解决方案1】:

这里有很多可以尝试的东西:

  1. 尝试使用 Read 打开,看看是否能解决您的问题
  2. 尝试添加完整的文件路径(以防无法打开)
  3. 打开文件时添加文件长度

勾选下面的三加一:

static void Main(string[] args)
{
    // Try with Read here and Read on your create view to see if anything changes
    FileStream fs = new FileStream("programe.exe", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.Read);
    // Set the length of the file here.
    MemoryMappedFile memory = MemoryMappedFile.CreateFromFile(fs, "mapname", fs.Length, MemoryMappedFileAccess.ReadExecute,null,0,false);

    MemoryMappedViewAccessor mmr = memory.CreateViewAccessor(0, fs.Length, MemoryMappedFileAccess.Read);

    Console.ReadKey();
}
  1. 然后检查您的文件“programe.exe”是否在您的文件系统中具有适当的权限

根据文档,ReadExecute 只是可执行文件的读取访问权限:

读取执行 4

对可以存储和运行可执行代码的文件的读取权限。

【讨论】:

  • 感谢您的回复,但我已经用您的代码更改了我的代码,但仍然抛出异常,当我将 ReadExecute 替换为 Read 时,它工作正常,但我想知道 Read 之间有什么区别,读取执行 ??
  • 虽然是一个很好的答案,但我认为 OP 也需要一个解释。 - “MemoryMappedFileAccess.ReadExecute 做什么或者我应该什么时候使用它?谁能给我解释一下?”
  • 不确定。您可能必须设置 HandleInheritability。阅读docs.microsoft.com/en-us/dotnet/api/…
  • 说实话,ReadExecute 对映射文件没有意义。映射文件用于在进程之间共享内存中的数据,我还没有找到 ReadExecute 用法的好例子。
猜你喜欢
  • 1970-01-01
  • 2011-03-23
  • 2011-01-18
  • 2011-08-18
  • 2017-03-21
  • 1970-01-01
  • 2010-12-30
  • 2011-02-21
相关资源
最近更新 更多