C# - 内存映射文件,MemoryMappedFileAccess.ReadExecute是什么或者何时应该使用它?

3

我了解了一些关于MemoryMappedFile的基础知识,并且发现其中有一个名为MemoryMappedFileAccess.ReadExecuteenum成员。

我认为这意味着当您打开一个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 好的,我该怎么做来解决这个异常? - Salo7ty
@CaiusJard 是的,我已经看过了。好的,Read和ReadExcecute之间有什么区别? - Salo7ty
1个回答

2

这里有很多可以尝试的方法:

  1. 尝试使用“读取”功能来解决问题
  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();
}

请检查您的文件“programe.exe”在文件系统中是否具有适当的权限。
根据文档,ReadExecute 只是可执行文件的读取访问权限:
“ReadExecute 4”:对可存储和运行可执行代码的文件的读取访问权限。

1
谢谢您的回复,但我已经使用您的代码更改了我的代码,仍然抛出异常。当我将ReadExecute替换为Read时,它可以正常工作,但我想知道Read和ReadExecute之间有什么区别? - Salo7ty
1
虽然这是一个很好的回答,但我认为 OP 也想要一个解释。 - “MemoryMappedFileAccess.ReadExecute 是做什么的?何时应该使用它?有人能给我解释一下吗?” - user585968
不确定。您可能需要设置HandleInheritability。请阅读https://learn.microsoft.com/en-us/dotnet/api/system.io.memorymappedfiles.memorymappedfile.createviewaccessor?view=netframework-4.8 - jdweng
说实话,对于映射文件来说,ReadExecute 没有意义。映射文件用于在进程之间共享内存中的数据,我还没有找到一个好的 ReadExecute 使用示例。 - Athanasios Kataras

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接