【问题标题】:why do I get an access denied exception when accessing a memory mapped file from c# but not from c++为什么从 c# 访问内存映射文件而不是从 c++ 访问内存映射文件时出现访问被拒绝异常
【发布时间】:2012-08-04 03:32:15
【问题描述】:

我有一个使用命名管道的 WCF 服务。显然不使用 url 作为名称。它从 url 生成 GUID,然后将其存储在内存映射文件中。所以我写了一个 C++ 应用程序,它从内存映射文件中获取管道的名称,效果很好。现在我正在尝试制作一个从内存映射文件中获取管道名称的 c# 应用程序。这是我正在使用的代码。

    private static string GetPipeName(string mappedFileName)
    {
        var mappedFile = MemoryMappedFile.OpenExisting(mappedFileName, MemoryMappedFileRights.Read);
        var bytes = new List<byte>();
        using (MemoryMappedViewStream s = mappedFile.CreateViewStream())
        {
            using (var b = new BinaryReader(s))
            {
                bytes = b.ReadBytes((int)b.BaseStream.Length).ToList();
            }

        }
        var sb = new StringBuilder();
        foreach (var b in bytes)
        {
            sb.Append(b.ToString("x2"));
            sb.Append(" ");
        }
        Console.WriteLine(sb.ToString());
        return sb.ToString();
    }

在第一个 using 语句中,我得到一个 UnauthorizedAccessException,它说“访问路径被拒绝。”

我能够逐步确认文件名与我在 c++ 应用程序中使用的文件名相同,并且在我使用 SysInternals 工具 Handle.exe 时显示

为什么 C# 应用程序会被拒绝访问?据我所知,两者都以同一用户身份运行。

【问题讨论】:

  • Scott.. 你能更具体地说明错误吗.. 也可能是访问错误,因为看起来你试图读取的文件可能正在被另一个进程使用,这意味着你不是关闭流
  • 看起来您遇到了 ViewAccessor 问题
  • @DJKRAZE - 我已更新问题以包含有关异常的更准确信息。它就在代码示例的下方。
  • 那么我应该使用 CreateViewAccessor 方法而不是 CreateViewStream 吗?
  • 查看此链接并向下滚动到答案。个人发布了 2 个工作示例。我相信您可以添加/删除以使其适用于您的示例。 stackoverflow.com/questions/10390829/…

标签: c# c++ wcf memory-mapped-files


【解决方案1】:

你需要使用以下

CreateViewAccessor(Int64, Int64, MemoryMappedFileAccess);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-18
    • 1970-01-01
    • 1970-01-01
    • 2020-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多