Способы передачи object между процессами
От: Necro...  
Дата: 23.03.10 07:57
Оценка:
Все доброго дня. Пишу add-in к приложению A, который должен запускать приложение B (т.е. запускать процесс приложения B) и передавать ему данные типа object.

Вопрос: как это можно сделать? Вся проблема в том, что самый ожидаемый способ передать object — с помощью каналов (.net remoting) не работает (object нельзя передавать таким способом. Пробовал писать прослойку — класс, наследованный от MarshalByRef, а свойством у него был как раз object. Тогда вроде все передалось, но при попытке считать с object, приложение просто падало, не выдав ексепшенов).

Какие еще есть способы передать object?

Заранее всем спасибо за советы!
Re: Способы передачи object между процессами
От: Codechanger Россия  
Дата: 23.03.10 07:59
Оценка:
Здравствуйте, Necro..., Вы писали:

N>Все доброго дня. Пишу add-in к приложению A, который должен запускать приложение B (т.е. запускать процесс приложения B) и передавать ему данные типа object.


N>Вопрос: как это можно сделать? Вся проблема в том, что самый ожидаемый способ передать object — с помощью каналов (.net remoting) не работает (object нельзя передавать таким способом. Пробовал писать прослойку — класс, наследованный от MarshalByRef, а свойством у него был как раз object. Тогда вроде все передалось, но при попытке считать с object, приложение просто падало, не выдав ексепшенов).


N>Какие еще есть способы передать object?


N>Заранее всем спасибо за советы!


Эммм... Вам что-нить говорит понятие "сериализация"?
Re[2]: Способы передачи object между процессами
От: Necro...  
Дата: 24.03.10 04:32
Оценка:
Здравствуйте, Codechanger, Вы писали:

C>Здравствуйте, Necro..., Вы писали:


N>>Все доброго дня. Пишу add-in к приложению A, который должен запускать приложение B (т.е. запускать процесс приложения B) и передавать ему данные типа object.


N>>Вопрос: как это можно сделать? Вся проблема в том, что самый ожидаемый способ передать object — с помощью каналов (.net remoting) не работает (object нельзя передавать таким способом. Пробовал писать прослойку — класс, наследованный от MarshalByRef, а свойством у него был как раз object. Тогда вроде все передалось, но при попытке считать с object, приложение просто падало, не выдав ексепшенов).


N>>Какие еще есть способы передать object?


N>>Заранее всем спасибо за советы!


C>Эммм... Вам что-нить говорит понятие "сериализация"?


Конечно говорит, вот только объект, который нужно передавать — сторонний. А как известно, чтобы сериализовать объект, нужно реализовывать интерфейс ISerializable. А этого сделать не получится.
Re[3]: Способы передачи object между процессами
От: Codechanger Россия  
Дата: 24.03.10 06:36
Оценка:
Здравствуйте, Necro..., Вы писали:

N> А как известно, чтобы сериализовать объект, нужно реализовывать интерфейс ISerializable. А этого сделать не получится.


Дык вы поконкретнее расскажите, что за объект(COM, не COM, что в себе несет и т.д.)
Re[3]: Способы передачи object между процессами
От: HowardLovekraft  
Дата: 24.03.10 07:02
Оценка:
Здравствуйте, Necro..., Вы писали:

N>А как известно, чтобы сериализовать объект, нужно реализовывать интерфейс ISerializable

Это смотря как сериализовать.
Re[4]: Способы передачи object между процессами
От: Necro...  
Дата: 24.03.10 08:05
Оценка:
Здравствуйте, Codechanger, Вы писали:

C>Здравствуйте, Necro..., Вы писали:


N>> А как известно, чтобы сериализовать объект, нужно реализовывать интерфейс ISerializable. А этого сделать не получится.


C>Дык вы поконкретнее расскажите, что за объект(COM, не COM, что в себе несет и т.д.)


Да кто бы его знал, какой там объект. В общем, постараюсь как можно детальнее описать: передаваемый объект — это по сути указатель на приложение. Приложение, для которого пишется аддин, запускает мой аддин и передает туда себя, т.е. object application. Аддин должен запутить процесс приложения и передать ему этот объект типа object. В дальнейшем запущенное приложение работает с этим object, приведя его к определеному типу, который берется из interop исходного приложения.
Re[5]: Способы передачи object между процессами
От: HowardLovekraft  
Дата: 24.03.10 08:15
Оценка:
Здравствуйте, Necro..., Вы писали:

N>передаваемый объект — это по сути указатель на приложение. Приложение, для которого пишется N>аддин, запускает мой аддин и передает туда себя, т.е. object application. Аддин должен N>запутить процесс приложения и передать ему этот объект типа object

Не думаю, что вам нужна сериализация. Передавайте через ремоутинг в приложение B прокси к исходному object'у, а не сам object.
Re[5]: Способы передачи object между процессами
От: Ellin Россия www.rsdn.ru
Дата: 24.03.10 09:45
Оценка:
Здравствуйте, Necro..., Вы писали:

N>Здравствуйте, Codechanger, Вы писали:


C>>Здравствуйте, Necro..., Вы писали:


N>>> А как известно, чтобы сериализовать объект, нужно реализовывать интерфейс ISerializable. А этого сделать не получится.


C>>Дык вы поконкретнее расскажите, что за объект(COM, не COM, что в себе несет и т.д.)


N>Да кто бы его знал, какой там объект. В общем, постараюсь как можно детальнее описать: передаваемый объект — это по сути указатель на приложение. Приложение, для которого пишется аддин, запускает мой аддин и передает туда себя, т.е. object application. Аддин должен запутить процесс приложения и передать ему этот объект типа object. В дальнейшем запущенное приложение работает с этим object, приведя его к определеному типу, который берется из interop исходного приложения.

А почему именно оbject, а не интерфейс?
Re[6]: Способы передачи object между процессами
От: Necro...  
Дата: 25.03.10 04:37
Оценка:
Здравствуйте, Ellin, Вы писали:

E>Здравствуйте, Necro..., Вы писали:


N>>Здравствуйте, Codechanger, Вы писали:


C>>>Здравствуйте, Necro..., Вы писали:


N>>>> А как известно, чтобы сериализовать объект, нужно реализовывать интерфейс ISerializable. А этого сделать не получится.


C>>>Дык вы поконкретнее расскажите, что за объект(COM, не COM, что в себе несет и т.д.)


N>>Да кто бы его знал, какой там объект. В общем, постараюсь как можно детальнее описать: передаваемый объект — это по сути указатель на приложение. Приложение, для которого пишется аддин, запускает мой аддин и передает туда себя, т.е. object application. Аддин должен запутить процесс приложения и передать ему этот объект типа object. В дальнейшем запущенное приложение работает с этим object, приведя его к определеному типу, который берется из interop исходного приложения.

E>А почему именно оbject, а не интерфейс?

Вообще можно и интерфейс наверное. Если есть разница, то в принципе, все равно Ну это в идеальном случае хотелось бы передать object, чтобы лишний раз не привязываться к интероп.
Re[7]: Способы передачи object между процессами
От: Jolly Roger  
Дата: 25.03.10 05:15
Оценка: 3 (1)
Здравствуйте, Necro..., Вы писали:

N>Ну это в идеальном случае хотелось бы передать object, чтобы лишний раз не привязываться к интероп.


Такого идеального случая не бывает, объекты никто никуда никогда не передаёт. Объект — это адрес набора байт, описывающих текущее состояние некоторой сущности. Передавать этот адрес в другой процесс просто бессмысленно, потому что там он будет указывать на совсем другие данные, либо вообще память по этому адресу будет не выделена. Говоря о передаче объекта, имеют в виду одно из:

  1. Сериализацию (marshalling by value) — передачу из процесса в процесс набора байт, описывающих текущее состояние объекта, мгновенный снимок, с последующим восстановлением его в целевом процессе. При этом создаётся новый экземпляр объекта и инициализируется полученными данными. Связь между новым и исходным экземплярами разрывается, никакое воздействие на новый экземпляр никак не сказывается на исходном объекте.

  2. (marshalling by reference) Создание канала связи, обеспечивающего передачу всех обращений к объекту из одного процесса в другой. При этом объект никуда не передаётся, взаимодействие обеспечивается путём создание посредников — proxy в целевом процессе и stub в исходном. Код в целевом процессе обращается к proxy, тот по каналу связи передаёт данные запроса stub'у, а он уже вызывает методы самого объекта. Ответ идёт в обратном порядке.

  3. Комбинацию первых двух, реализуемую, как правило, вручную.
"Нормальные герои всегда идут в обход!"
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.