Vb.net 剪贴板在两个应用程序之间复制粘贴对象

Vb.net 剪贴板在两个应用程序之间复制粘贴对象,vb.net,casting,clipboard,Vb.net,Casting,Clipboard,我试图在两个应用程序之间使用对象的复制粘贴,但出现了一个错误 “System.InvalidCastException:'无法将'System.IO.MemoryStream'类型的对象强制转换为'howto_net_clipboard_object.Employee'”,因此我从中获取了样本并开始实验。 要复制的对象是 <Serializable()> Public Class Employee Public FirstName As String Public L

我试图在两个应用程序之间使用对象的复制粘贴,但出现了一个错误 “System.InvalidCastException:'无法将'System.IO.MemoryStream'类型的对象强制转换为'howto_net_clipboard_object.Employee'”,因此我从中获取了样本并开始实验。 要复制的对象是

<Serializable()>
Public Class Employee
    Public FirstName As String
    Public LastName As String

    Public Sub New()
    End Sub
    Public Sub New(ByVal first_name As String, ByVal last_name As String)
        FirstName = first_name
        LastName = last_name
    End Sub
End Class
粘贴

Private Sub btnPaste_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnPaste.Click
    Dim data_object As IDataObject = Clipboard.GetDataObject
    If data_object.GetDataPresent("howto_net_clipboard_object.Employee") Then
        Dim emp As Employee = DirectCast(data_object.GetData("howto_net_clipboard_object.Employee"), Employee)
        txtDropFirstName.Text = emp.FirstName
        txtDropLastName.Text = emp.LastName
    Else
        txtDropFirstName.Text = ""
        txtDropLastName.Text = ""
    End If
End Sub   
测试1-转换源代码后-运行程序-工作

测试2-复制转换后的源代码-在一个程序中复制,在另一个程序中粘贴-工作

测试3-使用新项目打开VS,构建相同的表单布局,复制代码并运行我的新版本和原始版本。这一次,a收到了与我的应用程序中相同的错误


我遗漏了什么?

您可以使用该类将类对象序列化/反序列化为MemoryStream,然后将
[MemoryStream].ToArray()
设置为
剪贴板.SetData()的内容对象。使用允许指定自定义格式的重载。另一方面,将对象强制转换为
byte()
,并使用它重建传递给XmlSerializer的MemoryStream,以及
类型
(您的Employee类类型-as
GetType(Employee)
)进行反序列化。感谢Jimi的回复,但这不是一个答案,这是一个可能导致更多麻烦的旁路。我已经测试了另一个旁路,将数据写入临时文件,并通过剪贴板作为文件放置。我在两个测试程序上测试它,它在所有方向都有效。旁路?那个事件意味着什么?不能将跨域对象复制到剪贴板。你只能得到一个空的MemoryStream。您必须序列化类对象。没有程序集引用的BinaryFormatter相对复杂,而
XmlSerializer
非常简单(每次都需要4行代码)。如果你想将某个东西称为旁路,那将使用剪贴板进行数据通信,而不是WCF、NamedPipes、AnonymousPipes、NamedPipeServerStream/NamedPipeClientStream等。请参阅我最初的后测试2,其中有两个程序不仅使用XmlSerializer,而且它工作正常。是的,你对手术的描述不太清楚。如果您愿意,我可以向您展示如何使用命名管道在两个正在运行的应用程序之间进行通信,这样您就不会中断其他应用程序(可能还有您的应用程序)使用的剪贴板。
Private Sub btnPaste_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnPaste.Click
    Dim data_object As IDataObject = Clipboard.GetDataObject
    If data_object.GetDataPresent("howto_net_clipboard_object.Employee") Then
        Dim emp As Employee = DirectCast(data_object.GetData("howto_net_clipboard_object.Employee"), Employee)
        txtDropFirstName.Text = emp.FirstName
        txtDropLastName.Text = emp.LastName
    Else
        txtDropFirstName.Text = ""
        txtDropLastName.Text = ""
    End If
End Sub