10

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

4

2 回答 2

5

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

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

于 2012-05-29T17:23:00.160 回答
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;
}

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

于 2015-02-27T21:09:41.480 回答