如何使用共享内存段在两个托管进程之间共享数据?我在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"
对象的数据复制到此共享段,我需要将其传输到另一个进程。
答案 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。