是否可以判断对象是否在不同的AppDomain中运行?

时间:2010-03-09 14:17:57

标签: c# .net appdomain

我想知道我是否可以告诉我们创建了一个对象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运行的应用程序域。我认为这不仅仅是单元测试的优雅解决方案。如果有人可以帮助定义类似的方法,那将会很棒。

public string GetAppDomainNameWithDotNetWitchcraft(Foo myFoo)
{
    // Insert voodoo here.
}

编辑: 感谢您的回复和评论。我问过的问题已经得到了解答,这些评论帮助我意识到我的错误。我真正想要实现的是测试是否创建了一个新的AppDomain。

1 个答案:

答案 0 :(得分:5)

好吧,你可以通过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语句(试图考虑您自己域中的对象具有透明代理的情况)。