Межпроцессное Перетаскивание пользовательского объекта вводит в WinForms C#

Этот вопрос близко к тому, что я интересуюсь, но не совсем.

У меня есть приложение WinForms.NET, записанное в C#. У меня есть a ListView управление, которое отображает массив объектов C#. Я поднял трубку его так, чтобы можно было перетащить/отбросить эти listview объекты к другой форме в том же приложении, и это правильно передает массив объектов (тип 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 атрибут к классу не оказывает влияния вообще. Какие-либо другие идеи?

8
задан Micha Wiedenmann 28 June 2017 в 08:18
поделиться

3 ответа

Вы пересекаете границу процесса, ссылки на объекты не действительны в другом процессе. Класс DataObject поддерживает сериализацию объектов, чтобы получить их через стену, он использует BinaryFormatter. Поэтому, да, вам нужно применить атрибут [Serializable] к вашему классу и убедиться, что ваши объекты могут де/сериализоваться правильно.

5
ответ дан 6 December 2019 в 00:07
поделиться

Хорошо, это выстрел, вместо того, чтобы использовать целый ряд сеансов, попробуйте сделать это индивидуально, как это ...

   Session[] oDroppedSessions;
   try
   {
      if (e.Data.GetData("Fiddler.Session[]") != null){
          object[] objs = e.Data.GetData("Fiddler.Session[]");
          if (objs != null && objs.Length > 1){
             oDroppedSessions = new Session[objs.Length];
             int nIndex = 0;
             foreach(object obj in objs){
                if (obj is Session){
                  oDroppedSessions[nIndex] = (Session)obj;
                  nIndex++;
                }
             }
          }
      }
   }
   catch (Exception eX)
   {  // reaches here }

стоит выстрел, кроме того, чем стрельба в ноге, так как я не полностью понимаю сессию Попробуйте это ...

Надеюсь, это поможет, С уважением, Том.

0
ответ дан 6 December 2019 в 00:07
поделиться

Можно использовать "as" для розыгрыша, который позволит избежать исключения ("as" вернет "null" без броска исключения, если розыгрыш не удастся) - но я не думаю, что это решит вашу проблему (это просто позволит избежать действительного исключения), так как я согласен, что, скорее всего, вам придется сделать ваш класс сериализуемым. Вы можете проверить свою гипотезу, прокомментировав те поля, которые будет сложнее заставить его работать - только пока, чтобы проверить его.

-1
ответ дан 6 December 2019 в 00:07
поделиться
Другие вопросы по тегам:

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