2010-09-09 38 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