对于我的项目,我需要从其他 .Net 程序集访问资源,但我不想让它们加载,因为我可能会加载同一程序集的不同版本。
为此,我创建了另一个 AppDomain,我使用 CreateInstanceAndUnwrap 创建了一个从 MarshalByRefObject 派生的自定义类。在那个类中,我加载了程序集,它具有返回资源对象(字符串、位图等)的功能。
现在的问题是,在卸载临时 AppDomain 后,我无法保留对这些对象的引用(除了像结构这样的值类型对象),抛出 AppDomainUnloadedException。
那么是否可以将从另一个 AppDomain 获得的对象复制到当前 AppDomain 中,知道这些对象都可能是可序列化的或实现 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
最佳答案
在此特定上下文中,您可以使用 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,
关于c# - 将代理对象克隆到当前 AppDomain,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39756766/