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