我们如何使用共享内存段与两个托管进程之间的“对象”共享数据?

时间:2011-05-22 20:19:07

标签: c# .net c++-cli ipc shared-memory

如何使用共享内存段在两个托管进程之间共享数据?我在C ++ / CLI代码中使用"object"来与其他进程中的其他内存部分共享数据。我正在使用以下代码段。

#define BUFFER_SIZE 32768   

#pragma data_seg (".SHAREDMEMORY")
    bool _Locked = false;
    bool _Initialized = false;  
    unsigned char[10000] data = NULL;
#pragma data_seg() 

#pragma comment(linker,"/SECTION:.SHAREDMEMORY,RWS")

但我需要它:

#pragma data_seg (".SHAREDMEMORY")
    bool _Locked = false;
    bool _Initialized = false;  
    object^ _object = nullptr;
#pragma data_seg() 

#pragma comment(linker,"/SECTION:.SHAREDMEMORY,RWS")

它说"global or static variable may not have managed type System::Int32^"并提供其他错误,例如"missing ; before '^'"

我必须将.NET "Control"对象的数据复制到此共享段,我需要将其传输到另一个进程。

3 个答案:

答案 0 :(得分:5)

最好是描述你想要做什么,而不是在你撞墙时询问如何继续,墙可能是死路一条。

。像Windows Forms和WPF这样的.Net类实现了Windows accessibility and automation APIs,因为微软努力遵守美国法律Americans with Disabilities Act以保护残疾人。

虽然API的设计主要是为了让残疾人更容易访问为Microsoft平台编写的软件,但API以这样一种方式公开软件,即现在可以实现标准化的UI自动化。您的应用程序可测试性所需的内容现已简化为making your app accessible

API由Microsoft's Microsoft UI Automation Framework调用,Accessibility Overview是托管代码的许多测试框架使用的框架。要了解有关Windows辅助功能API的更多信息或查找基于Windows辅助功能和自动化API的开源项目,请访问testing and debug column

有一些关于在MSDN杂志的{{3}}中测试应用程序的提示。

答案 1 :(得分:3)

您不能将.NET对象放在共享内存中。

指针仅在创建它们的过程中有效。因此,只有在没有指针的情况下才能共享数据(或者使用基于寻址的概念,这种概念在32位平面内存模型中基本上是死的)。 p>

有时您可以使用具有v表的C ++对象,只要库在所有进程中加载​​其首选基址。但.NET函数具有动态地址,因为它们是在运行时编译的。没有希望元数据指针在不同进程之间匹配。

另外,垃圾收集如何工作?垃圾收集需要查看所有引用以了解对象是否可访问,但您无法看到其他进程的非共享区域。那个堆将返回哪个堆?

结论:您不能将.NET对象放在共享段,共享内存映射文件或使用按位序列化。相反,您需要将普通旧数据放在共享区域中,并使用原始本机指针(甚至不是C ++智能指针,请参阅上面有关内存管理的注释)。您可以将该指针包装在C ++ / CLI对象中以使其友好,但您无法共享.NET对象本身。

答案 2 :(得分:1)

您需要某种形式的IPC,例如memory mapped file