我有一个 DoDragDrop,我在其中将数据设置为 Point
。当我在一个实例中拖动时 – 一切正常。但是当我在程序的两个实例之间拖动时,Visual Studio 给我这个错误:
The specified record cannot be mapped to a managed value class.
为什么?
编辑:这是代码:
DataObject d = new DataObject();
d.SetData("ThePoint", MyPoint);
DragDropEffects e = DoDragDrop(d, DragDropEffects.Move);
和:
Point e2 = (Point)e.Data.GetData("ThePoint");
最佳答案
The specified record cannot be mapped
请注意“记录”这个词的奇怪之处。它是一个以 COM 为中心的词,表示“struct”。您尝试做的事情几乎 有效,但不完全有效。 DoDragDrop() 方法正确地将 Point 结构编码为 COM 对象,这可能是因为 Point 具有 [ComVisible(true)] 属性。缺少的成分是 IRecordInfo 所需的信息,IRecordInfo 是一个描述结构布局的 COM 接口(interface)。必需的,因为结构具有非常依赖于编译器的布局。
该接口(interface)通常通过从类型库中读取结构定义来实现。实际上可用,Point 结构在 c:\windows\microsoft.net\framework\v2.0.50727\system.drawing.tlb 中有描述。您可以使用 OleView.exe 工具、File + View Typelib 查看它。
一切都很好,除了 COM 对象的接收者必须将其转换回托管对象(Point)的部分。这需要找出包含对象定义的类型库,以便 IRecordInfo 可以完成它的工作。其中记录在注册表中的HKCR\Record键。其中不包含 Point 的条目。轰隆隆。
创建你自己的类(不是结构)来存储数据,给它 [Serializable] 属性,这样它就可以被简单地编码。
关于c# - 为什么我不能在程序的两个实例之间拖动一个点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10979900/