Здравствуйте. Мне нужно передать контрол из одного процесса в другой перетаскиванием. Не вникая в суть сего действия я написал так
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.
Не очень понял.
Напрямую ссылку с объекта из процесса в процесс не передать. У процессов память разная. Процессы объекты друг друга не видят.
Если вам нужно только состояние объекта: например, в одном процессе тем или иным способом инициализировали и передаете во второй процесс. То тут достаточно, чтобы в процессы были загружены сборки с типом вашего объекта, и через сериализацию склонировать ваш объект.
Но поскольку вы пишите, что вам сериализация не подходит, могу предположить, что вы хотите из одного процесса обращаться к методам и свойствам объекта другого процесса, чтобы это вызывало некий отклик в первом процессе (ну допустим через события генерирующие при изменении состояния объекта). Тогда во втором процессе нужен некий прокси-объект, который, когда обращаются к его методам и свойствам, будет посредством некой системы сообщений обращаться к методам и свойствам исходного объекта. Это похоже на .NET Remoting или WCF.
эммм....так не бывает. При закрытии другого процесса, объекта больше не будет.
Если вам нужна некоторая общая функциональность для разных процессов, то может стоит ее выделить в отдельный процесс, например в службу?
Передать "объект" из одного приложения в другое нельзя, ибо память у каждого своя и нельзя просто так "отдать" другому процессу кусок своей памяти "на попользоваться". В вашем случае я вижу решение только через сериализацию. Не вижу проблем сериализовать инициализированый объект, обычно именно такие объекты и сериализуют. Не ясно также что это за объект перетаскивается, возможно достаточно передать его "параметры" а на другом процессе просто создать его снова.
А что, если инициализация длится несколько секунд? А что, если эта инициализация еще и на БД давит? Повторная инициализация недопустима, проще просто отказаться от задумки, если нет иного решения.