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

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

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

指针仅在创建过程中有效。因此,只有在没有指针的情况下才能共享数据(或者使用基于寻址的概念,这种概念在32位平面存储器模型中大部分都是死的)。

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

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

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

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

像Windows Forms和WPF这样的.Net类实现Windows可访问性和自动化API,因为微软正在努力遵守美国残疾人法案 ,这是一项保护残疾人的美国法律。

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

这些API由Microsoft的Microsoft UI Automation Framework调用,这是许多托管代码测试框架使用的框架。 要了解有关Windows辅助functionAPI的更多信息或查找基于Windows辅助function和自动化API的开源项目,请访问辅助function概述 。

在MSDN Magazine的测试和调试专栏中有一些关于测试应用程序的提示。

您需要某种forms的IPC,例如内存映射文件 。