我有一个 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从物理上讲是指向指针的指针,其值仅适用于创建地址空间。

恕我直言。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top