开发者社区 问答 正文

C#-MemoryMappedFile,什么MemoryMappedFileAccess.ReadE

我了解了有关MemoryMappedFile的一些基础知识,并且看到MemoryMappedFileAccess中有一个名为ReadExcute的值,我认为这意味着当您打开一个exe文件时,它(我的程序)执行该文件(.exe文件)并读取其中的字节(。 exe文件),但是当我执行程序时,它抛出一个错误:拒绝访问路径[UnauthorizedAccessException]

mycode:

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();
    }

谁能向我解释一下?谢谢 :)

展开
收起
几许相思几点泪 2019-12-05 15:23:33 321 分享 版权
阿里云 AI 助理回答

在您的代码中,您尝试使用MemoryMappedFileAccess.ReadExecute来创建一个内存映射文件。这个访问权限确实意味着您希望对文件有读取和执行的权限。然而,在.NET环境中,尤其是当处理.exe等可执行文件时,直接通过MemoryMappedFile这样的方式来“执行”文件内容是不合适的,这并不是该API设计的目的。

错误UnauthorizedAccessException通常表示您没有足够的权限去访问指定的资源(在这个案例中是文件)。对于.exe文件,操作系统通常会施加额外的安全限制,特别是当尝试以一种非标准方式(如通过内存映射)访问它们时。

实际上,MemoryMappedFileAccess.ReadExecute在这里的意图可能被误解了。这个访问级别更多地用于那些需要同时读取和指示CPU可以执行这些数据的场景,比如某些特定类型的代码或数据段映射,但这并不意味着它能直接用来“运行”一个.exe程序。在Windows上,直接执行PE(Portable Executable,即.exe、.dll等格式)文件通常涉及到加载器服务,这些服务负责解析文件头、分配内存、设置执行环境等复杂操作,而不是简单地映射到内存并尝试执行。

如果您只是想读取.exe文件的内容(比如分析其二进制结构),那么应该只使用MemoryMappedFileAccess.Read权限,并且不需要FileAccess.ReadWrite,因为您并不打算修改文件。此外,确保您的程序有足够的权限访问目标文件,检查文件路径是否正确,以及是否有其他进程正在锁定该文件。

修正后的代码示例:

static void Main(string[] args)
{
    // 确保您有读取权限即可,无需ReadWrite
    FileStream fs = new FileStream("programe.exe", FileMode.Open, FileAccess.Read, 
        FileShare.Read);

    try
    {
        // 只需读取权限
        MemoryMappedFile memory = MemoryMappedFile.CreateFromFile(fs, "mapname", 0, 
            MemoryMappedFileAccess.Read);

        using (MemoryMappedViewAccessor mmr = memory.CreateViewAccessor(0, fs.Length, MemoryMappedFileAccess.Read))
        {
            // 在这里您可以安全地读取文件内容
            // ...
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine($"An error occurred: {ex.Message}");
    }
    finally
    {
        fs.Close();
    }

    Console.ReadKey();
}

这段代码更正了访问权限,并简化了异常处理逻辑,应该能够帮助您避免UnauthorizedAccessException,前提是您有权限读取目标文件。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答地址: