我有一個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