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

#c# #.net #c -cli #ipc #shared-memory

#c# #.net #c -cli #ipc #разделяемая память

Вопрос:

Как я могу совместно использовать данные между двумя управляемыми процессами, используя сегменты общей памяти? Я использую "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 '^'" как.

Я должен скопировать .Данные сетевого "Control" объекта передаются в этот общий сегмент, и мне нужно, чтобы они были переданы другому процессу.

Комментарии:

1. object^ является указателем, а не самим объектом. Даже если вы создадите object^ глобальный объект, он все равно будет находиться в частной управляемой куче только одного процесса.

Ответ №1:

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

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

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

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

В колонке «Тестирование и отладка» журнала MSDN Magazine есть несколько советов по тестированию приложений.

Ответ №2:

Вы не можете поместить .СЕТЕВЫЕ объекты в общей памяти.

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

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

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

Вывод: Вы не можете поместить .СЕТЕВЫЕ объекты в общих сегментах, файлы с отображением в общую память или используйте побитовую сериализацию. Вместо этого вам нужно поместить обычные старые данные в общую область и использовать необработанные собственные указатели (даже не интеллектуальные указатели C , см. Комментарии выше об управлении памятью). Вы можете обернуть этот указатель в объект C / CLI, чтобы сделать его дружественным, но вы не можете поделиться .Сам СЕТЕВОЙ объект.

Комментарии:

1. Все, что вы имели в виду, это то, что я не могу создать общую область, где собственный объект .NET (т.е. .NET управляет объектами, унаследованными от Windows. Формы) может находиться даже тип, приведенный в классе «object». Значит, я не могу сделать так, чтобы эти объекты управления были разделены в сегментах общей памяти?

2. @Usman: Это правильно. Объекты .NET полагаются на указатели (как указатели метаданных, хранящиеся в объекте, так и gc, ищущий указатели на объект). Таким образом, двоичные данные не могут быть использованы из другого процесса.

3. Итак, каким было бы тогда возможное решение этой проблемы ..? Извлечь информацию о нескольких элементах управления из подключенного процесса и перенести ее в другой процесс. Нужно ли мне создавать свои собственные объекты (т. е. пользовательские), а затем считывать данные каждого свойства и копировать данные в мой пользовательский объект.?

4. @Usman: Вам нужно сериализовать данные в переносимый формат. Как да, это потребует чтения каждого свойства. Называете ли вы результат пользовательским объектом или потоком байтов, на самом деле не имеет значения. Вы можете увидеть, не можете ли вы использовать существующий. СЕТЕВЫЕ классы сериализатора, вместо того, чтобы писать свои собственные.

5. Да!1 правильно, это я решил и в основном я реализовал ..:-)

Ответ №3:

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

Комментарии:

1. Мне нужно совместно использовать элементы управления .NET, тип которых приведен в переменной класса «object». Они хорошо преобразуют тип, но когда они сериализуются с помощью двоичных формататоров, использующих разделяемую память, среда CLR выдает исключение, которое «Sytem. Формы. Элементы управления «не помечены как сериализуемые.

2. Чего вы пытаетесь достичь?

3. Мне нужно пройти. Объекты сетевого управления из какого-либо подключенного процесса в другой процесс. Вот почему мне нужно создать некоторый сегмент общей памяти и пройти через эти объекты для другого процесса. Для этого предположим, что я получил некоторый список<Control> от этого подключенного процесса, и теперь мне нужно передать список этих объектов какому-либо другому управляемому процессу, если я выполняю сериализацию с помощью двоичных файлов, среда CLR не разрешит, поскольку объект управления не помечен как сериализуемый, и я не могу этого сделать. Итак, есть ли какой-либо возможный способ передать этот список<Control> другому управляемому процессу. Если требуется какая-либо информация, сообщите

4. зачем вам нужно это делать? Какую проблему вы пытаетесь решить?

5. это была бы долгая история ..:-) Но это то, что мне было нужно. Для создания автоматизированной платформы для тестирования . СЕТЕВЫЕ приложения.