获取对象的 AppDomain

Posted

技术标签:

【中文标题】获取对象的 AppDomain【英文标题】:Get the AppDomain of object 【发布时间】:2012-06-03 22:41:48 【问题描述】:

有什么方法可以确定在哪个 AppDomain 中创建了对象或 ObjectHandle 实例?

【问题讨论】:

好问题,但我怀疑答案是否定的:( 【参考方案1】:

如果您的对象使用(例如)从另一个 AppDomain 到当前 AppDomain 的序列化“旅行”,那么它基本上是在您当前的 AppDomain 中“创建”的。源 AppDomain 可以是当前计算机上的单独进程或远程计算机上的另一个进程。据我所知,我认为 CLR 不会为您跟踪这些,因为您负责在进程之间移动对象。您可能需要向您的类添加一个字段,以便您可以设置和获取该信息。

或者考虑使用LogicalCallContext 对象,在跨应用程序域进行通话时为您跟踪此信息。 Here 是 Jeffrey Richter 写的一篇很好的博客。

【讨论】:

我不是指旅行物品。我想获取 AppDomain ,在该 AppDomain 中可以访问对象而无需穿过障碍。我有一个在某些 AppDomain 中创建的不可序列化类的实例。我想获得那个域名。 @IllidanS4:如果您能够从您编写的代码中访问不可序列化类的实例,那么该实例不会位于AppDomain.CurrentDomain 中吗?【参考方案2】:

来自另一个应用程序域的对象是透明代理。可以获取真正的代理并访问包含域 id 的私有字段:

public static int GetObjectAppDomain(object proxy)

    RealProxy rp = RemotingServices.GetRealProxy(proxy);
    int id = (int)rp.GetType().GetField("_domainID", BindingFlags.Instance|BindingFlags.NonPublic).GetValue(rp);
    return id;

如果可能的应用程序域列表未知,here 是一种获取所有应用程序域列表的方法。

【讨论】:

以上是关于获取对象的 AppDomain的主要内容,如果未能解决你的问题,请参考以下文章

AppDomain 卷影副本 - 加载/卸载动态加载的 Dll

即使我卸载 appdomain,我的 dll 也不会卸载

怎么获取点击的数组对象

jquery 怎么获取对象的id

获取对象是不是也获取核心数据中的关系对象

3.3 获取Mapper对象