【发布时间】: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