【问题标题】:Memory Mapped File Access Denied内存映射文件访问被拒绝
【发布时间】:2013-01-15 19:22:00
【问题描述】:

我正在尝试将一段匆忙拼凑起来的旧代码重构为更优雅的代码。

项目有两个部分,一个 Windows 服务和一个监视服务活动的表单应用程序。

为了允许这种通信,我决定使用非持久内存映射文件。

以下是旧项目中的工作代码:

var security = new MemoryMappedFileSecurity();
security.AddAccessRule(new AccessRule<MemoryMappedFileRights>("everyone", MemoryMappedFileRights.FullControl,AccessControlType.Allow));

file = MemoryMappedFile.CreateOrOpen(@"Global\" + instance, bufferSize,
                     MemoryMappedFileAccess.ReadWrite,
                     MemoryMappedFileOptions.DelayAllocatePages, security,
                     HandleInheritability.Inheritable);

上面的代码在一个由 Service 和 Form 运行的 ctor 中,它们使用完全相同的代码,并且无论哪个创建 mmf 都可以工作。

现在我在一个新项目中有相同的代码,但是如果服务首先创建 mmf,则表单会收到拒绝访问路径的错误,如果表单创建 mmf,则服务“打开”他的身边很好,但是两人都看不到所写的信息,这让我相信他们实际上看的不是同一件事。

此时我不知道从哪里开始调试问题,由于会话 0 隔离,我正在使用安全规则和“全局\”命名空间。

我只是无法理解为什么它可以在一个方面起作用,而在另一个方面不起作用。

任何关于从这里去哪里的建议都将不胜感激。此外,如果需要更多代码,请告诉我。

【问题讨论】:

  • 您是否以提升的用户身份运行?我相信要创建一个全球地图,你必须有海拔。
  • 我是管理员,如果重要的话,我会在管理员模式下为此项目运行 Visual Studios 2010
  • 你提到它是一个运行它的服务。该服务是作为 LocalService 运行的,还是另一个提升的用户?我认为任何级别的权限都可以访问全局 MMF,但要创建一个,您必须是管理员。
  • 服务在两个项目中作为本地系统运行。服务和表单都可以“创建”MMF,否则我会假设我会收到某种错误。

标签: c# c#-4.0 service memory-mapped-files


【解决方案1】:

因此,在经历了很多悲伤之后,我找到了问题的答案。

显然,Visual Studios 不喜欢我将包含该代码的文件添加到我的项目中的方式。我只是做了一个“添加现有”。

为了解决这个问题,我创建了一个新类,并从另一个文件中复制/粘贴了代码:

现在一切正常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多