C# 使用C中的HBITMAP句柄检索远程位图#

C# 使用C中的HBITMAP句柄检索远程位图#,c#,remoting,hbitmap,C#,Remoting,Hbitmap,我有一个MarshalByRefObject,我需要将其序列化并存储(在数据库中),以便以后可以反序列化并引用它。我选择了不同的方法:现在我正在运行一个Windows服务,它只会使MarshalByRefObject保持“活动”(请注意远程对象实际上是一个第三方对象,我不是自己创建的): 在另一个AppDomain中,我只需连接并检索对象;所有工作都很好: RemoteObject myLocalObject = (FCEngine.IFCVerificationSession)Activato

我有一个
MarshalByRefObject
,我需要将其序列化并存储(在数据库中),以便以后可以反序列化并引用它。我选择了不同的方法:现在我正在运行一个Windows服务,它只会使
MarshalByRefObject
保持“活动”(请注意
远程对象实际上是一个第三方对象,我不是自己创建的):

在另一个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服务AppDomain中。我的问题是我的选择是什么:

  • RemoteObject
    相当复杂,它就像一棵树,通过调用它的函数来遍历节点。第三方强制我只能遍历对象一次。所以,在服务端遍历它、将位图存储在数据库中并再次远程遍历它是行不通的
  • 理想情况是能够在Windows服务中调用函数,并将hbitmap句柄作为参数传递,返回实际位图。这在Windows服务中是不可能的
  • 我可以将句柄存储在数据库中,并让Windows服务为其轮询数据库。然后它可以检索位图并为我将其存储在同一个DB中。然后,我可以再次远程检索该位图。这是非常丑陋的,因为我需要立即位图
基本上,我想知道,如果你有建议,不必执行丑陋的黑客像第三个选项…我的选择是什么

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

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

p.S.物理句柄是指向指针的指针,其值仅在创建地址空间时适用


IMHO.

您检查权限了吗?
IntPtr hbitmap = (IntPtr)myLocalObject.ContextImage;
System.Drawing.Bitmap bmp = System.Drawing.Image.FromHbitmap(hbitmap);