题
我有一个 MarshalByRefObject
我需要序列化和存储(在数据库中),因此我可以在以后进行审理并引用它。我选择以不同的方式处理此操作:现在我正在运行Windows服务,这只是保留 MarshalByRefObjects
“活着”(请注意 RemoteObject
实际上是第三方对象,我不会创建自己):
// This is the object which extends the MarshalByRefObject class
RemoteObject myRemoteObject = new RemoteObject;
TcpServerChannel channel = new TcpServerChannel(6789);
ChannelServices.RegisterChannel(channel, true);
ObjRef objRef = RemotingServices.Marshal((System.MarshalByRefObject)myRemoteObject, id);
在另一个应用程序中,我只需连接并检索对象;一切都很好:
RemoteObject myLocalObject = (FCEngine.IFCVerificationSession)Activator.GetObject(
typeof(FCEngine.IFCVerificationSession),"tcp://localhost:6789/" + id);
现在问题是 RemoteObject
包含一个仅仅是一个属性 HBITMAP
施放到 long
类型。我可以轻松地检索手柄。通常(本地)我会做:
IntPtr hbitmap = (IntPtr)myLocalObject.ContextImage;
System.Drawing.Bitmap bmp = System.Drawing.Image.FromHbitmap(hbitmap);
在当前情况下这无效。我得到一个 System.Runtime.InteropServices.ExternalException
我想问题是 hbitmap
是在本地AppDomain中而是Windows Service AppDomain中不存在的某些内存的处理。我的问题是我的选择是什么:
- 这
RemoteObject
非常复杂,就像一棵树,您可以通过调用其函数来穿越节点。第三方强加了我只能穿越对象一次。因此,穿越IT服务侧,将位图存储在数据库中,并再次远程浏览它无法使用。 - 理想是能够在Windows服务中调用函数,并将HBITMAP句柄作为参数传递,以返回实际位图。这在Windows服务中是不可能的。
- 我可以将手柄存储在数据库中,并使Windows Service对其进行调查。然后,它可以检索位图并为我存储在同一DB中。然后,我可以再次远程检索该位图。这非常丑陋,因为我需要立即使用位图。
基本上,我想知道您是否有建议不必像第三选项那样执行丑陋的黑客……我的选择是什么?
解决了现在,我通过创建一个自定义对象来解决问题,该对象在服务方面扩展了元帅。该对象具有通过传递手柄来检索和保存位图的方法。我只是像接近第三方对象一样远程接近对象。解决方案太简单了,尽管同事必须指出这一点。
解决方案
HBITMAP是一个手柄,没有任何序列化的手柄。您需要序列化位图内容,在远程侧重新创建(位图),然后重新分配新创建的HBITMAP。
PS从物理上讲是指向指针的指针,其值仅适用于创建地址空间。
恕我直言。
不隶属于 StackOverflow