【发布时间】:2011-12-10 02:20:17
【问题描述】:
我需要我的服务来更新共享内存中的字段,以便客户端应用程序读取和显示。由于Session 0 Isolation,我发现我当前的解决方案无效。
我已在全局命名空间中重命名了 mutexes,它修复了该元素,但看起来 dll 似乎无法在会话之间共享,尽管会话 0 隔离的一种解决方案是:
"为任何命名对象显式选择 Local\ 或 Global\ 命名空间,例如 服务提供的事件或映射内存。”
我不知道dll的哪个部分可以归类为命名对象,并且需要很长时间才能继续重新安装并逐步检查它。
我看到命名频道的代码量并被推迟。我不想创建一个触及磁盘的文件,因为我想象 memoryMappedFile 解决方案需要它。可以使 dll 的共享部分工作吗?否则什么是最简单的?
public ref class ServerGUIBridge
{
public:
#pragma data_seg(".sdata")
static int commonIntShouldBeGlobal = 0;
static bool hasBeenInitializedMakeMeGlobal = false;
#pragma data_seg()
#pragma comment(linker, "/section:.sdata,rws")
我使用的是 .NET 2.0,所以请不要使用 WCF。
【问题讨论】:
-
如果使用 INVALID_FILE_HANDLE 创建内存映射文件,则不会创建文件。它只是在一段时间未访问时被分页的内存。请注意,共享部分是一个安全漏洞——您不能将 ACL 放在共享部分上。 (如果客户进入并执行
hasBeenInitializedMakeMeGlobal = false或commonIntShouldBeGlobal = rand()会发生什么?) -
@Raymond "如果hFile为INVALID_HANDLE_VALUE,调用进程还必须在dwMaximumSizeHigh和dwMaximumSizeLow参数中指定文件映射对象的大小。在这种情况下,CreateFileMapping会创建一个指定大小的文件映射对象它由系统页面文件支持,而不是由文件系统中的文件支持。” -- 那么如果系统分页文件被关闭,它在哪里支持呢?
-
“由系统页面文件支持”措辞不佳。它真的应该“由虚拟内存系统支持”。如果页面文件被禁用,那么虚拟内存系统只是物理内存。
标签: .net service .net-2.0 ipc shared-memory