获取对象的 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的主要内容,如果未能解决你的问题,请参考以下文章