Imports System.Reflection Imports Microsoft.VisualBasic.ComponentModel.DataSourceModel Namespace TaskHost Module ShadowsCopy ''' ''' 将客户端上面的对象数据复制到远程主机上面的内存管理模块之中 ''' ''' Client上面的 ''' 服务器上面的 ''' 内存管理模块单元 ''' Public Function ShadowsCopy(from As Object, target As Object, memory As MemoryHash) As Boolean Dim p As Long = ObjectAddress.AddressOf(target).ReferenceAddress Return __innerCopy(from, target, memory, New List(Of Long) + p) End Function ''' ''' ''' ''' ''' 远程服务器上面的对象 ''' 远程对象的内存管理模块 ''' Avoided of the loop reference.(内存管理的复制堆栈记录) ''' Private Function __innerCopy(from As Object, target As Object, memory As MemoryHash, stack As List(Of Long)) As Boolean Dim props As PropertyInfo() = from.GetType.GetReadWriteProperties For Each prop As PropertyInfo In props Dim value As Object = prop.GetValue(from) If BasicTypesFlushs.ContainsKey(prop.PropertyType) Then Call prop.SetValue(target, value) ' 值类型,直接复制 Else ' 引用类型,递归按址复制 Dim addr As ObjectAddress = ObjectAddress.AddressOf(value) ' 得到对象在内存之中的位置指针 If memory.IsNull(addr.ReferenceAddress) Then Call memory.SetObject(value) ' 空的,则直接插入 Else Dim innerTarget As Object = prop.GetValue(target) addr = ObjectAddress.AddressOf(innerTarget) ' 假若是引用类型的对象,在复制的时候还需要检查栈空间,否则会出现死循环 栈空间溢出 ' 检查栈空间是否已经复制过当前的对象了? If stack.IndexOf(addr.ReferenceAddress) = -1 Then ' 假若出现循环引用的话,应该怎样进行复制?? Call stack.Add(addr.ReferenceAddress) ' 写栈路径记录 Call __innerCopy(value, innerTarget, memory, stack) ' 假若已经存在了,则递归进入下一层复制 End If End If End If Next Return True End Function End Module End Namespace