Is there any way to determine in which AppDomain was an object or ObjectHandle instance created?
An object from another app domain is a transparent proxy. It is possible to get the real proxy and access the private field that contains the domain 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;
}
If the list of possible app domains isn't known, here is a way to get the list of all app domains.
If your object "travelled" using (e.g.) serialization from another AppDomain to the current AppDomain then it has essentially been "created" in your current AppDomain. The source AppDomain could be a separate process on the current computer or another process on a remote computer. As far as I am aware, I don't think that the CLR keeps track of that for you, since you are responsible for moving objects between processes. You would probably need to add a field to your class so that you can set and get that information.
Or consider using a LogicalCallContext object that tracks this information for you while travelling with a call accross appdomains. Here is a good blog by Jeffrey Richter about this.
AppDomain.CurrentDomain
? –
Travis An object from another app domain is a transparent proxy. It is possible to get the real proxy and access the private field that contains the domain 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;
}
If the list of possible app domains isn't known, here is a way to get the list of all app domains.
© 2022 - 2024 — McMap. All rights reserved.