Все доброго дня. Пишу add-in к приложению A, который должен запускать приложение B (т.е. запускать процесс приложения B) и передавать ему данные типа object.
Вопрос: как это можно сделать? Вся проблема в том, что самый ожидаемый способ передать object — с помощью каналов (.net remoting) не работает (object нельзя передавать таким способом. Пробовал писать прослойку — класс, наследованный от MarshalByRef, а свойством у него был как раз object. Тогда вроде все передалось, но при попытке считать с object, приложение просто падало, не выдав ексепшенов).
Здравствуйте, Necro..., Вы писали:
N>Все доброго дня. Пишу add-in к приложению A, который должен запускать приложение B (т.е. запускать процесс приложения B) и передавать ему данные типа object.
N>Вопрос: как это можно сделать? Вся проблема в том, что самый ожидаемый способ передать object — с помощью каналов (.net remoting) не работает (object нельзя передавать таким способом. Пробовал писать прослойку — класс, наследованный от MarshalByRef, а свойством у него был как раз object. Тогда вроде все передалось, но при попытке считать с object, приложение просто падало, не выдав ексепшенов).
N>Какие еще есть способы передать object?
N>Заранее всем спасибо за советы!
Эммм... Вам что-нить говорит понятие "сериализация"?
Здравствуйте, Codechanger, Вы писали:
C>Здравствуйте, Necro..., Вы писали:
N>>Все доброго дня. Пишу add-in к приложению A, который должен запускать приложение B (т.е. запускать процесс приложения B) и передавать ему данные типа object.
N>>Вопрос: как это можно сделать? Вся проблема в том, что самый ожидаемый способ передать object — с помощью каналов (.net remoting) не работает (object нельзя передавать таким способом. Пробовал писать прослойку — класс, наследованный от MarshalByRef, а свойством у него был как раз object. Тогда вроде все передалось, но при попытке считать с object, приложение просто падало, не выдав ексепшенов).
N>>Какие еще есть способы передать object?
N>>Заранее всем спасибо за советы!
C>Эммм... Вам что-нить говорит понятие "сериализация"?
Конечно говорит, вот только объект, который нужно передавать — сторонний. А как известно, чтобы сериализовать объект, нужно реализовывать интерфейс ISerializable. А этого сделать не получится.
Здравствуйте, Necro..., Вы писали:
N> А как известно, чтобы сериализовать объект, нужно реализовывать интерфейс ISerializable. А этого сделать не получится.
Дык вы поконкретнее расскажите, что за объект(COM, не COM, что в себе несет и т.д.)
Здравствуйте, Necro..., Вы писали:
N>А как известно, чтобы сериализовать объект, нужно реализовывать интерфейс ISerializable
Это смотря как сериализовать.
Здравствуйте, Codechanger, Вы писали:
C>Здравствуйте, Necro..., Вы писали:
N>> А как известно, чтобы сериализовать объект, нужно реализовывать интерфейс ISerializable. А этого сделать не получится.
C>Дык вы поконкретнее расскажите, что за объект(COM, не COM, что в себе несет и т.д.)
Да кто бы его знал, какой там объект. В общем, постараюсь как можно детальнее описать: передаваемый объект — это по сути указатель на приложение. Приложение, для которого пишется аддин, запускает мой аддин и передает туда себя, т.е. object application. Аддин должен запутить процесс приложения и передать ему этот объект типа object. В дальнейшем запущенное приложение работает с этим object, приведя его к определеному типу, который берется из interop исходного приложения.
Здравствуйте, Necro..., Вы писали:
N>передаваемый объект — это по сути указатель на приложение. Приложение, для которого пишется N>аддин, запускает мой аддин и передает туда себя, т.е. object application. Аддин должен N>запутить процесс приложения и передать ему этот объект типа object
Не думаю, что вам нужна сериализация. Передавайте через ремоутинг в приложение B прокси к исходному object'у, а не сам object.
Здравствуйте, Necro..., Вы писали:
N>Здравствуйте, Codechanger, Вы писали:
C>>Здравствуйте, Necro..., Вы писали:
N>>> А как известно, чтобы сериализовать объект, нужно реализовывать интерфейс ISerializable. А этого сделать не получится.
C>>Дык вы поконкретнее расскажите, что за объект(COM, не COM, что в себе несет и т.д.)
N>Да кто бы его знал, какой там объект. В общем, постараюсь как можно детальнее описать: передаваемый объект — это по сути указатель на приложение. Приложение, для которого пишется аддин, запускает мой аддин и передает туда себя, т.е. object application. Аддин должен запутить процесс приложения и передать ему этот объект типа object. В дальнейшем запущенное приложение работает с этим object, приведя его к определеному типу, который берется из interop исходного приложения.
А почему именно оbject, а не интерфейс?
Здравствуйте, Ellin, Вы писали:
E>Здравствуйте, Necro..., Вы писали:
N>>Здравствуйте, Codechanger, Вы писали:
C>>>Здравствуйте, Necro..., Вы писали:
N>>>> А как известно, чтобы сериализовать объект, нужно реализовывать интерфейс ISerializable. А этого сделать не получится.
C>>>Дык вы поконкретнее расскажите, что за объект(COM, не COM, что в себе несет и т.д.)
N>>Да кто бы его знал, какой там объект. В общем, постараюсь как можно детальнее описать: передаваемый объект — это по сути указатель на приложение. Приложение, для которого пишется аддин, запускает мой аддин и передает туда себя, т.е. object application. Аддин должен запутить процесс приложения и передать ему этот объект типа object. В дальнейшем запущенное приложение работает с этим object, приведя его к определеному типу, который берется из interop исходного приложения. E>А почему именно оbject, а не интерфейс?
Вообще можно и интерфейс наверное. Если есть разница, то в принципе, все равно Ну это в идеальном случае хотелось бы передать object, чтобы лишний раз не привязываться к интероп.
Здравствуйте, Necro..., Вы писали:
N>Ну это в идеальном случае хотелось бы передать object, чтобы лишний раз не привязываться к интероп.
Такого идеального случая не бывает, объекты никто никуда никогда не передаёт. Объект — это адрес набора байт, описывающих текущее состояние некоторой сущности. Передавать этот адрес в другой процесс просто бессмысленно, потому что там он будет указывать на совсем другие данные, либо вообще память по этому адресу будет не выделена. Говоря о передаче объекта, имеют в виду одно из:
Сериализацию (marshalling by value) — передачу из процесса в процесс набора байт, описывающих текущее состояние объекта, мгновенный снимок, с последующим восстановлением его в целевом процессе. При этом создаётся новый экземпляр объекта и инициализируется полученными данными. Связь между новым и исходным экземплярами разрывается, никакое воздействие на новый экземпляр никак не сказывается на исходном объекте.
(marshalling by reference) Создание канала связи, обеспечивающего передачу всех обращений к объекту из одного процесса в другой. При этом объект никуда не передаётся, взаимодействие обеспечивается путём создание посредников — proxy в целевом процессе и stub в исходном. Код в целевом процессе обращается к proxy, тот по каналу связи передаёт данные запроса stub'у, а он уже вызывает методы самого объекта. Ответ идёт в обратном порядке.
Комбинацию первых двух, реализуемую, как правило, вручную.