是否可以判断一个对象是否在不同的 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 中运行?的主要内容,如果未能解决你的问题,请参考以下文章

HashMap和Hashtable的同和不同(详细比较)

JavaScript 判断对象中是否有某属性

JavaScript 判断对象中是否有某属性

判断对象是否有某个属性

判断一个js对象是否是Array,最准确的方法

php判断checkbox是不是为空