我有一个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来解决这个问题。该对象有一个通过传递句柄来检索和保存位图的方法。我只是简单地接近对象,就像我接近我的第三方对象一样。一个解决方案太简单了,尽管一位同事必须指出。
你检查了权限吗? – 2010-09-09 08:21:16