【问题标题】:Sharing memory between Windows Service and Application, what is easiest?在 Windows 服务和应用程序之间共享内存,什么是最简单的?
【发布时间】: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 = falsecommonIntShouldBeGlobal = rand() 会发生什么?)
  • @Raymond "如果hFile为INVALID_HANDLE_VALUE,调用进程还必须在dwMaximumSizeHigh和dwMaximumSizeLow参数中指定文件映射对象的大小。在这种情况下,CreateFileMapping会创建一个指定大小的文件映射对象它由系统页面文件支持,而不是由文件系统中的文件支持。” -- 那么如果系统分页文件被关闭,它在哪里支持呢?
  • “由系统页面文件支持”措辞不佳。它真的应该“由虚拟内存系统支持”。如果页面文件被禁用,那么虚拟内存系统只是物理内存。

标签: .net service .net-2.0 ipc shared-memory


【解决方案1】:

我建议使用命名管道:那么您可以在两个进程之间进行适当的受控隔离。共享 DLL 听起来很危险。

命名管道记录在 MSDN 上:http://msdn.microsoft.com/en-us/library/aa365590.aspx

这里有一篇有用的 .NET 2.0 文章:http://www.switchonthecode.com/tutorials/interprocess-communication-using-named-pipes-in-csharp

(请记住,.NET 3.5 及更高版本有一个 NetNamedPipeBinding 类 [http://msdn.microsoft.com/en-us/library/system.servicemodel.netnamedpipebinding.aspx],它是 WCF 的一部分)

【讨论】:

  • 我曾经尝试在提升的进程和普通进程之间共享命名管道,但这是不可能的。有什么特殊的参数需要设置吗?
  • 对@RedX 提出的问题进行ping/bump ?
【解决方案2】:

所有 .NET 框架版本都具有远程处理功能。它允许调用另一个可以在不同进程中的应用程序域中的方法。有关示例和用法,请参阅 MSDN:http://msdn.microsoft.com/en-us/library/kwdt6w2k(v=VS.80).aspx

【讨论】:

  • 我真的应该了解远程处理。一天。它与 PC 间通信有关,因此开销很大。
  • Remoting 可用,但对于较新的 .NET 版本来说已过时,取而代之的是更灵活(也更复杂?)的 WCF。
  • @JeremyMcGee 不再;显然 WCF 现在被劝阻或弃用。但是,我认为本页讨论的问题不需要任何形式的全面远程处理。不能只创建一个继承自 MarshalByRef 对象的对象,以便在 AppDomain 之间共享它吗?
【解决方案3】:

一种经常被忽视的 IPC 方法是写入注册表。对于我建议分享的两个 POD 成员,这将是理想的解决方案。 IPC, MSDN, and the registry

【讨论】:

    猜你喜欢
    • 2021-08-12
    • 1970-01-01
    • 2013-09-14
    • 2011-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多