获取对象的AppDomain

10

有没有办法确定一个对象或ObjectHandle实例是在哪个AppDomain中创建的?


好问题,但我怀疑答案是否定的 :( - leppie
2个回答

5
如果你的对象使用(例如)序列化从另一个AppDomain到当前AppDomain,则它实际上已在当前AppDomain中被"创建"。源AppDomain可以是当前计算机上的单独进程或远程计算机上的另一个进程。据我所知,我认为CLR不会替你跟踪这一点,因为你有责任在进程之间移动对象。你可能需要向你的类添加一个字段,以便设置和获取该信息。
或者考虑使用LogicalCallContext对象,在跨appdomains调用时跟踪此信息。这里是Jeffrey Richter关于此问题的优秀博客

我不是指可移动的对象。我想在不穿越屏障的情况下获取对象所在的AppDomain。我有一个在某个AppDomain中创建的非可序列化类的实例。我想获取该域。 - IS4
@IllidanS4:如果你能够从你编写的代码中访问一个非可序列化类的实例,那么这个实例不就在AppDomain.CurrentDomain里吗? - Oliver

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;
}

如果可能的应用程序域列表未知,这里提供了一种获取所有应用程序域列表的方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接