是否可以判断一个对象是否在不同的 AppDomain 中运行?
Posted
技术标签:
【中文标题】是否可以判断一个对象是否在不同的 AppDomain 中运行?【英文标题】:Is it possible to tell if an object is running in a different AppDomain? 【发布时间】:2010-03-09 14:17:57 【问题描述】:我想知道我是否可以知道一个对象是在哪个 appdomain 中创建的。这是一个单元测试,也是有用的一般知识。我有以下代码(这是示例代码)。
public Foo Create()
AppDomainSetup appDomainSetup =
new AppDomainSet ApplicationBase = @"z:\SomePath"
AppDomain appDomain =
AppDomain.CreateDomain("DomainName", null, appDomainSetup);
return (Foo) appDomain.CreateInstanceAndUnwrap("MyAssembly", "MyClass");
然后我打电话
Foo myFoo = Create();
我想做的是找出 myFoo 上的哪个 AppDomain 方法将被调用,以测试 Create 方法是否实际上创建了一个新的 AppDomain。我意识到我可以在 Foo 上添加一个方法,比如
public class Foo
public string appDomainName
get return AppDomain.CurrentDomain.FriendlyName;
这将为我提供 Foo 正在运行的 appdomain。我认为这不是仅用于单元测试的优雅解决方案。如果有人可以帮助定义类似的方法,那就太好了。
public string GetAppDomainNameWithDotNetWitchcraft(Foo myFoo)
// Insert voodoo here.
编辑: 感谢您的回复和cmets。我提出的问题已经得到解答,cmets 帮助我意识到我哪里出错了。我真正想要实现的是测试是否创建了一个新的 AppDomain。
【问题讨论】:
【参考方案1】:好吧,假设您完全信任跑步,您可以通过 Remoting/Reflection 进行一些 Spelunking。请注意,您必须访问私有属性,并且假设它唯一可以找到的是由于跨应用程序域而进行的远程处理:
var a = Create();
if (System.Runtime.Remoting.RemotingServices.IsTransparentProxy(a))
var c = System.Runtime.Remoting.RemotingServices.GetObjRefForProxy(a);
var ad = c.ChannelInfo.ChannelData[0];
var propDomainId = ad.GetType().GetProperty("DomainID", BindingFlags.NonPublic | BindingFlags.Instance);
var DomainID = propDomainId.GetValue(ad,null);
然后,您可以将该域 ID 与您自己的域 ID 进行比较,以了解它是否在您的域中。请注意,如果 if 语句 在您的域中,您不太可能输入它(尝试考虑在您自己的域中拥有一个对象的透明代理的情况)。 p>
【讨论】:
有趣。我没想到。 我不介意一些探索。这很有用。虽然如果我在单元测试中看到它确实有设计味道:) @btlog - 我很好奇一个对象是否在不同的 AppDomain 中是一种设计味道,但是编写一个单元测试来确保它不是(如果你明白我的意思的话)? 。你说的对。请参阅我对问题的编辑。你们都帮助我重新定位了我哪里出错了。以上是关于是否可以判断一个对象是否在不同的 AppDomain 中运行?的主要内容,如果未能解决你的问题,请参考以下文章