2010-09-09 43 views
0

我有一个MarshalByRefObject,我需要序列化和存储(在数据库中),所以我可以反序列化并在以后引用它。我选择以不同的方式接近这一点:现在我正在运行一个Windows服务,它只是保持MarshalByRefObjects“活着”(请注意RemoteObject实际上是一个第三方的对象,这是我没有创建自己):检索远程位图,在C#中使用HBITMAP句柄

// 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); 

在另一个AppDomain中,我只需连接并检索对象;一切工作正常:

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是相当复杂的,这就像在你通过调用其功能遍历节点树。第三方规定我只能遍历一次对象。因此遍历它服务端,将位图存储在数据库中,并再次远程遍历它将不起作用。
  • 理想的是能够在Windows服务中调用函数,并将hbitmap句柄作为参数传递,返回实际的位图。这在Windows服务中是不可能的。
  • 我可以将句柄存储在数据库中,并使Windows服务为其查询数据库。然后它可以检索位图并将其存储在同一个数据库中。然后我可以再次远程检索该位图。这非常难看,因为我立即需要位图。

基本上我想知道如果你有建议,不必执行丑陋的黑客,如第三选项......我有什么选择?

求解 现在我通过创建一个自定义对象来扩展服务端的MarshalByRefObject来解决这个问题。该对象有一个通过传递句柄来检索和保存位图的方法。我只是简单地接近对象,就像我接近我的第三方对象一样。一个解决方案太简单了,尽管一位同事必须指出。

+0

你检查了权限吗? – 2010-09-09 08:21:16

回答

1

HBitmap是一个句柄,它没有意义序列化非托管句柄。您需要序列化位图内容,在远程端重新创建它(位图),然后重新分配新创建的hbitmap。

P.S.物理处理是指向指针的指针,其值仅适用于创建地址空间。

恕我直言。

+0

你是对的。请参阅我的文章中已解决的部分。 – 2010-09-09 09:19:59