不可序列化对象上的C#DoDragDrop

不可序列化对象上的C#DoDragDrop,c#,winforms,exception,drag-and-drop,C#,Winforms,Exception,Drag And Drop,我有一个用户控件,可以在我的表单中拖动。当控件被意外地从我的窗体拖到桌面上时,我第一次遇到异常(例如): 当我开始拖放过程时,我传入一个Control类型的对象。它不是可序列化的,我也不希望它是可序列化的。是否有解决此问题的方法,或者是否有将对象拖动到宿主窗体之外的处理方法 调用堆栈: > System.Windows.Forms.dll!System.Windows.Forms.DataObject.GetDataIntoOleStructs(ref System.Runtime.I

我有一个用户控件,可以在我的表单中拖动。当控件被意外地从我的窗体拖到桌面上时,我第一次遇到异常(例如):

当我开始拖放过程时,我传入一个Control类型的对象。它不是可序列化的,我也不希望它是可序列化的。是否有解决此问题的方法,或者是否有将对象拖动到宿主窗体之外的处理方法

调用堆栈:

>   System.Windows.Forms.dll!System.Windows.Forms.DataObject.GetDataIntoOleStructs(ref System.Runtime.InteropServices.ComTypes.FORMATETC formatetc, ref System.Runtime.InteropServices.ComTypes.STGMEDIUM medium) + 0x175 bytes 
    System.Windows.Forms.dll!System.Windows.Forms.DataObject.System.Runtime.InteropServices.ComTypes.IDataObject.GetDataHere(ref System.Runtime.InteropServices.ComTypes.FORMATETC formatetc, ref System.Runtime.InteropServices.ComTypes.STGMEDIUM medium) + 0x70 bytes    
    System.Windows.Forms.dll!System.Windows.Forms.DataObject.System.Runtime.InteropServices.ComTypes.IDataObject.GetData(ref System.Runtime.InteropServices.ComTypes.FORMATETC formatetc, out System.Runtime.InteropServices.ComTypes.STGMEDIUM medium) + 0x152 bytes   
    [Native to Managed Transition]  

这是另一个堆栈,但VS2010挂起,所以我无法复制和粘贴它

我不清楚这个异常是如何触发的,桌面不应该使用你的控制。鼠标光标应显示“此处无法放置”形状。然而,D+D期间的第一次机会异常是没有意义的,它们被吞咽,不会影响操作。您只能看到它们,因为您已附加了调试器

如果您真的想深入了解这一点,那么使用Debug+异常,勾选公共语言运行时异常的抛出框。引发异常时,调试器将停止。它很可能是在Winforms管道代码中提出的,除非启用引用源,否则您将无法查看源代码。如果你想不出来,就在问题中张贴堆栈跟踪。请确保复制整个框架,如有必要,请滚动以获取顶部激活框架


但重申,这在实践中不应成为问题。用户应该会看到“无法拖放”鼠标光标,在不终止程序的情况下,异常会被吞没。

我不希望我的对象被拖到桌面或其他应用程序中。MSDN DoDragDrop声明:如果拖动操作需要与另一进程中的应用程序进行互操作,则数据应为基本托管类(字符串、位图或图元文件),或者是实现ISerializable或IDataObject的对象。当用户拖动或删除选项时,是否阻止用户将控件移动到窗口边界之外?这是我不想要它的唯一原因,因为我无法将其拖动到窗口之外。问题是程序抛出异常。堆栈跟踪不够深。这可能意味着代码是由drop目标激活的,而不是由事件处理程序激活的。对此你无能为力。把忽略的部分翻过来。这不太清楚,但是Hans说,因为这只是第一次机会的例外,所以只要你的程序能正常工作,你就可以忽略它。通常只有未处理的异常才需要担心。
>   System.Windows.Forms.dll!System.Windows.Forms.DataObject.GetDataIntoOleStructs(ref System.Runtime.InteropServices.ComTypes.FORMATETC formatetc, ref System.Runtime.InteropServices.ComTypes.STGMEDIUM medium) + 0x175 bytes 
    System.Windows.Forms.dll!System.Windows.Forms.DataObject.System.Runtime.InteropServices.ComTypes.IDataObject.GetDataHere(ref System.Runtime.InteropServices.ComTypes.FORMATETC formatetc, ref System.Runtime.InteropServices.ComTypes.STGMEDIUM medium) + 0x70 bytes    
    System.Windows.Forms.dll!System.Windows.Forms.DataObject.System.Runtime.InteropServices.ComTypes.IDataObject.GetData(ref System.Runtime.InteropServices.ComTypes.FORMATETC formatetc, out System.Runtime.InteropServices.ComTypes.STGMEDIUM medium) + 0x152 bytes   
    [Native to Managed Transition]