【问题标题】:Is it possible to tell if an object is running in a different AppDomain?是否可以判断一个对象是否在不同的 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。

【问题讨论】:

    标签: c# .net 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 中是一种设计味道,但是编写一个单元测试来确保它不是(如果你明白我的意思的话)?
    • 。你说的对。请参阅我对问题的编辑。你们都帮助我重新定位了我哪里出错了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-01
    • 2013-07-15
    • 2011-05-21
    • 1970-01-01
    • 1970-01-01
    • 2011-11-28
    相关资源
    最近更新 更多