是否可能判断一个对象是否在不同的应用程序域中运行?

7

我希望知道是否可以确定一个对象是在哪个应用程序域中创建的。这是为了进行单元测试,同时也是有用的一般性知识。我有以下代码片段(这是示例代码,仅供说明)。

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个回答

5

如果您以完全信任的方式运行,则可以通过Remoting/Reflection进行一些探险。请注意,您必须访问私有属性,并且这假定唯一发现的事情是由于跨应用程序域而引起的远程处理:

    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与自己的域进行比较,以了解它是否在您的域中。请注意,如果它在您的域中,您很可能不会进入if语句(尝试考虑一下您需要透明代理到自己域中的对象的情况)。


有趣。我没有想到那个。 - Brian Rasmussen
我不介意进行一些探险。那是有用的。虽然如果我在一个单元测试中看到了这个,它确实有设计上的问题 :) - btlog
@btlog - 我很好奇如何判断一个对象是否在不同的AppDomain中是一种设计上的问题,但编写单元测试来确保它不是(如果你明白我的意思的话)? - Damien_The_Unbeliever
你说得对。请看我对问题的编辑。你们所有人都帮助我意识到了我的错误。 - btlog

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接