对于我的项目,我需要从其他.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