@iRumba

Как через DragDrop передать объект по ссылке?

Здравствуйте. Мне нужно передать контрол из одного процесса в другой перетаскиванием. Не вникая в суть сего действия я написал так
DragDrop.DoDragDrop(_el, _el, DragDropEffects.Move);
для начала перетаскивания, где _el это перетаскиваемый элемент
var ll = e.Data.GetData("System.Windows.Controls.Label") as Label;
для приема, где e - DragEventArgs
Ну и получаю ошибку
"Тип носителя задан неверно (Исключение из HRESULT: 0x80040069 (DV_E_TYMED))"

Мне еще до запуска показалось, что чего то здесь не так )
Сериализация мне не подходит, так как мне требуется передать уже инициализированный объект (Label в моем случае лишь для тренировки).
Что такое маршализация я толком не понял и не знаю, подойдет ли она мне.
IpcChannel мне тоже не подойдет (кажется), потому что он нужен для удаленного обращения к объекту (если я все правильно понял).
Тогда вопрос, что же мне подойдет для моей задачи?

Мне нужно каким то образом передать перетаскиванием ссылку на объект, о типе которого знают оба процесса, подобно тому, как перетягиваются вкладки в браузере Google Chrome.
  • Вопрос задан
  • 325 просмотров
Пригласить эксперта
Ответы на вопрос 2
DmitryITWorksMakarov
@DmitryITWorksMakarov
Не очень понял.
Напрямую ссылку с объекта из процесса в процесс не передать. У процессов память разная. Процессы объекты друг друга не видят.

Если вам нужно только состояние объекта: например, в одном процессе тем или иным способом инициализировали и передаете во второй процесс. То тут достаточно, чтобы в процессы были загружены сборки с типом вашего объекта, и через сериализацию склонировать ваш объект.

Но поскольку вы пишите, что вам сериализация не подходит, могу предположить, что вы хотите из одного процесса обращаться к методам и свойствам объекта другого процесса, чтобы это вызывало некий отклик в первом процессе (ну допустим через события генерирующие при изменении состояния объекта). Тогда во втором процессе нужен некий прокси-объект, который, когда обращаются к его методам и свойствам, будет посредством некой системы сообщений обращаться к методам и свойствам исходного объекта. Это похоже на .NET Remoting или WCF.
Ответ написан
Neuroware
@Neuroware
Программист в свободное от работы время
Передать "объект" из одного приложения в другое нельзя, ибо память у каждого своя и нельзя просто так "отдать" другому процессу кусок своей памяти "на попользоваться". В вашем случае я вижу решение только через сериализацию. Не вижу проблем сериализовать инициализированый объект, обычно именно такие объекты и сериализуют. Не ясно также что это за объект перетаскивается, возможно достаточно передать его "параметры" а на другом процессе просто создать его снова.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы