Межпроцессное перетаскивание пользовательских типов объектов в WinForms C#
Этот вопрос близок к тому, что мне интересно, но не совсем.
У меня есть приложение.NET WinForms, написанное на C#. у меня есть ListView
элемент управления, который отображает массив объектов C#. Я подключил его, чтобы вы могли перетаскивать эти элементы списка в другую форму в одном приложении, и он правильно передает массив объектов (тип Session
) обработчику отбрасывания для этой другой формы.
Однако теперь я хочу поддерживать межпроцессное перетаскивание, когда я запускаю несколько экземпляров своего приложения. Похоже, что это будет работать (например, GetDataPresent
успешно), но в конечном итоге выдает исключение, когда я на самом деле пытаюсь получить данные - не могу привести object[]
в Session[]
,
if (e.Data.GetDataPresent("Fiddler.Session[]"))
{
Session[] oDroppedSessions;
try
{
oDroppedSessions = (Session[])e.Data.GetData("Fiddler.Session[]");
}
catch (Exception eX)
{ // reaches here
}
}
Кто-нибудь знает, если я должен реализовать ISerializable
для моих объектов, чтобы сделать эту работу? Обычно, я бы просто попробовал, но реализуя ISerializable
для этого класса было бы довольно нетривиальным, и я беспокоюсь, что это может быть странные побочные эффекты.
ОБНОВЛЕНИЕ: Реализация ISerializable
не помогает - метод никогда не вызывается. Точно так же, добавив Serializable
Атрибут к классу никак не влияет. Есть другие идеи?
3 ответа
Вы пересекаете границу процесса, ссылки на объекты недопустимы в другом процессе. Класс DataObject поддерживает сериализацию объектов, чтобы переместить их через стену, он использует BinaryFormatter. Итак, да, вам нужно применить атрибут [Serializable] к вашему классу и убедиться, что ваши объекты могут де-сериализоваться должным образом.
Хорошо, это выстрел, вместо использования целого массива сессий, попробуйте сделать это индивидуально, как это...
Session [] oDroppedSessions; пытаться { if (e.Data.GetData("Fiddler.Session[]")!= null){ object[] objs = e.Data.GetData("Fiddler.Session[]"); if (objs!= null && objs.Length > 1){ oDroppedSessions = новая сессия [objs.Length]; int nIndex = 0; foreach(объект obj в объектах){ if (obj is Session){ oDroppedSessions[nIndex] = (Session)obj; nIndex++; } } } } } поймать (Exception eX) { // достигает здесь}
Стоит попробовать, кроме как выстрелить себе в ногу, так как я не до конца понимаю сессионную часть, попробуйте...
Надеюсь, это поможет, С наилучшими пожеланиями, Том.
Вы можете использовать "как" для приведения, что позволит избежать исключения ("as" вернет "ноль", не выбрасывая исключение в случае сбоя приведения) - но я не думаю, что это решит вашу проблему (это просто позволит избежать реальной исключение), поскольку я согласен, вероятно, вам придется сделать ваш класс сериализуемым. Вы можете проверить свою гипотезу, комментируя поля, которые будут сложнее заставить ее работать - только сейчас, чтобы проверить это.