Как мы можем разделить данные, используя сегмент общей памяти с «Объектом» между двумя управляемыми процессами? - PullRequest
1 голос
/ 23 мая 2011

Как я могу обмениваться данными между двумя управляемыми процессами, используя сегменты общей памяти?Я использую "object" внутри кода C ++ / CLI для обмена данными с какой-то другой частью памяти в другом процессе.Я использую следующий сегмент кода.

#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 ]

5 голосов
/ 23 мая 2011

Лучше, если вы опишите, что вы хотите сделать, вместо того, чтобы спрашивать, как продолжить, когда вы ударились о стену, стена может оказаться тупиком.

.Net классы, такие как Windows Forms и WPF, реализуют API доступа и автоматизации Windows как усилия Microsoft по соблюдению Закона об американцах-инвалидах , закона США о защите инвалидов.

Хотя API-интерфейсы предназначены главным образом для того, чтобы сделать программное обеспечение, написанное для платформы Microsoft, более доступным для инвалидов, API-интерфейсы предоставляют программное обеспечение таким образом, что теперь возможна стандартизированная автоматизация пользовательского интерфейса. То, что вам нужно сделать, чтобы приложение стало тестируемым, теперь упрощено до , делая ваше приложение доступным

API вызываются Microsoft Automation Framework Microsoft , фреймворк, используемый многими средами тестирования для управляемого кода. Чтобы узнать больше об API доступа к Windows или найти проекты с открытым исходным кодом, основанные на API доступности и автоматизации Windows, посетите Обзор специальных возможностей .

В столбце тестирования и отладки .

есть несколько советов по тестированию приложений.
3 голосов
/ 23 мая 2011

Нельзя помещать объекты .NET в общую память.

Указатели действительны только в том процессе, в котором они созданы. Таким образом, данные могут совместно использоваться, только если они не имеют указателей (или используют адресацию на основе, концепция, которая в основном устарела в 32-разрядной модели плоской памяти).

Иногда вы можете обойтись без объектов C ++, которые имеют v-таблицу, если библиотека загружается по своему предпочтительному базовому адресу во всех процессах. Но функции .NET имеют динамические адреса, потому что они компилируются во время выполнения. Нет надежды, что указатели метаданных будут совпадать между различными процессами.

Кроме того, как будет работать сборка мусора? Сборщик мусора должен видеть все ссылки, чтобы знать, достижим ли объект, но вы не сможете увидеть неиспользуемую область других процессов. И в какую кучу будет возвращена память?

Заключение. Нельзя помещать объекты .NET в общие сегменты, отображаемые файлы общей памяти или использовать побитовую сериализацию. Вместо этого вам нужно поместить простые старые данные в общую область и использовать необработанные родные указатели (даже не умные указатели C ++, см. Выше комментарии об управлении памятью). Вы можете обернуть этот указатель в объект C ++ / CLI, чтобы сделать его дружественным, но вы не можете использовать сам объект .NET.

1 голос
/ 23 мая 2011

Вам нужна какая-то форма IPC, например файл с отображением в памяти .

...