有没有办法确定哪个AppDomain是对象或ObjectHandle实例创建的?
答案 0 :(得分:5)
如果您的对象使用(例如)从另一个AppDomain序列化到当前AppDomain“旅行”,那么它基本上已在您当前的AppDomain中“创建”。源AppDomain可以是当前计算机上的单独进程,也可以是远程计算机上的其他进程。据我所知,我不认为CLR会为您跟踪,因为您负责在进程之间移动对象。您可能需要在类中添加一个字段,以便设置和获取该信息。
或者考虑使用LogicalCallContext对象来跟踪此信息,同时通过appdomains进行通话。 Here是杰弗里里希特关于此的好博客。
答案 1 :(得分:4)
来自其他应用领域的对象是透明代理。可以获取真实代理并访问包含域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是获取所有应用域列表的方法。