c# - 将代理对象克隆到当前 AppDomain

标签 c#

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

相关文章:

c# - N 个连续字符的 .NET 正则表达式

c# - WPF 文本框中的必填字段验证

c# - ASP.NET Web 服务 - 如何使用连接字符串将其连接到数据库?

c# - 有没有办法让 C# 使用 MBean 通过 JMX 与 Java 服务器通信?

c# - MongoDB GridFs with C#,如何存储图片等文件?

c# - 判断当前应用是否激活(有焦点)

c# - Generic Cast,将 int 转换为 double 是不可能的

C# 性能 - 指向热循环中跨度的指针

c# - C# 对 native 互操作的限制

c# - 如何修改C# Designer.cs文件中的注释