對於我的項目,我需要從其他.Net程序集訪問資源,但我不想讓它們保持加載狀態,因爲我可能會加載相同程序集的不同版本。將代理對象克隆到當前AppDomain中
因此,爲了做到這一點,我創建了另一個使用CreateInstanceAndUnwrap創建從MarshalByRefObject下降的自定義類的AppDomain。在那個類中我加載了程序集,它有一個返回資源對象(字符串,位圖等)的函數。
現在的問題是,在臨時AppDomain被卸載後(除了像結構體這樣的值類型對象除外),我無法保留對這些對象的引用,所以拋出了AppDomainUnloadedException。
那麼是否有可能將從另一個AppDomain獲得的對象複製到當前AppDomain中,知道這些對象都可能是Serializable或實現ISerializable?
可能很重要的一點是,Bitmap繼承自MarshalByRefObject,實現ISerializable並具有Serializable屬性。這是一個小小的片段來演示這個問題。
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