WinForms C#中的跨进程拖放自定义对象类型

Eri*_*Law 8 c# drag-and-drop winforms iserializable

这个问题接近我感兴趣的问题,但并不完全.

我有一个用C#编写的.NET WinForms应用程序.我有一个ListView显示C#对象数组的控件.我已将它连接起来,以便您可以将这些listview项拖放到同一应用程序中的不同表单,并将对象数组(类型Session)正确传递给该另一个表单的drop handler.

但是,我现在想要支持跨进程拖放,我运行应用程序的多个实例.这看起来它将起作用(例如GetDataPresent成功),但最终在我实际尝试检索数据时抛出异常 - 无法转换object[]Session[].

if (e.Data.GetDataPresent("Fiddler.Session[]"))
{
   Session[] oDroppedSessions;
   try
   {
      oDroppedSessions = (Session[])e.Data.GetData("Fiddler.Session[]");
   }
   catch (Exception eX)
   {  // reaches here 
   }
}
Run Code Online (Sandbox Code Playgroud)

任何人都知道我是否必须ISerializable为我的对象实现才能使其工作?通常情况下,我只是尝试一下,但实现ISerializable这个课程将是非常重要的,我担心这样做可能会产生奇怪的副作用.


更新:实现ISerializable没有帮助 - 永远不会调用该方法.同样,将Serializable属性添加到类中也没有任何影响.还有其他想法吗?

Han*_*ant 5

您正在跨进程边界,对象引用在另一个进程中无效。DataObject类支持对对象进行序列化以使其遍地开花,它使用BinaryFormatter。因此,是的,您需要将[Serializable]属性应用于您的类,并确保您的对象可以正确地反序列化。

  • 使用DataFormat.Serializable触发序列化代码。 (2认同)