Межпроцессное перетаскивание пользовательских типов объектов в 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" вернет "ноль", не выбрасывая исключение в случае сбоя приведения) - но я не думаю, что это решит вашу проблему (это просто позволит избежать реальной исключение), поскольку я согласен, вероятно, вам придется сделать ваш класс сериализуемым. Вы можете проверить свою гипотезу, комментируя поля, которые будут сложнее заставить ее работать - только сейчас, чтобы проверить это.

Другие вопросы по тегам