2016-09-28 28 views
1

對於我的項目,我需要從其他.Net程序集訪問資源,但我不想讓它們保持加載狀態,因爲我可能會加載相同程序集的不同版本。將代理對象克隆到當前AppDomain中

因此,爲了做到這一點,我創建了另一個使用CreateInstanceAndUnwrap創建從MarshalByRefObject下降的自定義類的AppDomain。在那個類中我加載了程序集,它有一個返回資源對象(字符串,位圖等)的函數。

現在的問題是,在臨時AppDomain被卸載後(除了像結構體這樣的值類型對象除外),我無法保留對這些對象的引用,所以拋出了AppDomainUnloadedException。

那麼是否有可能將從另一個AppDomain獲得的對象複製到當前AppDomain中,知道這些對象都可能是Serializable或實現ISerializable?

可能很重要的一點是,Bitmap繼承自MarshalByRefObject,實現ISerializable並具有Seri​​alizable屬性。這是一個小小的片段來演示這個問題。

class ImageGrabber : MarshalByRefObject 
{ 
    public Image GetImage() { return new Bitmap(16,16); } 
} 

//testing 
var tmpDomain = AppDomain.CreateDomain("test"); 
var proxy = (ImageGrabber)tmpDomain.CreateInstanceAndUnwrap(
    typeof(ImageGrabber).Assembly.FullName, 
    typeof(ImageGrabber).FullName); 
Bitmap myImage = proxy.GetImage(); 
AppDomain.Unload(tmpDomain); 
pictureBox.Image = myImage;//throws AppDomainUnloadedException 

回答

0

看起來像位圖不喜歡被序列化......它的許多屬性都是類型未標記爲可序列化,即使Save方法也不起作用,因爲它必須使用代理對象無法序列化的屬性。所以我別無選擇,只能在運行臨時AppDomain的代碼中將圖像轉換爲流(或字節數組也可以)。

然後,該流仍然附加到AppDomain,但幸好流類型序列化沒有困難,所以我可以將它複製到MemoryStream中。

0

在這種特定的情況下,你可以使用System.Drawing.ImageConverter

var myImage = proxy.GetImage(); 

var converter = new ImageConverter(); 
var data = (byte[])converter.ConvertTo(myImage, typeof(byte[]); 

AppDomain.Unload(tmpDomain); 
pictureBox.Image = (Bitmap)converter.ConvertFrom(data); 

注意:你的問題的代碼,我不認爲這編譯,順便說一句:

Bitmap myImage = proxy.GetImage(); 

「HTH ,