在Windows服务和应用程序之间共享内存,最简单的方法是什么?

时间:2011-10-18 13:07:58

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

我需要我的服务来更新共享内存中的字段,以便客户端应用程序读取和显示。由于Session 0 Isolation,我发现我当前的解决方案无效。

我已经在全局命名空间中重命名了mutex es,它修复了该元素,但看起来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。

3 个答案:

答案 0 :(得分: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的一部分)

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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