2010-03-09 24 views
7

我想知道是否可以告诉哪个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的方法将被调用,以测试的创建方法实际上已经创造了一个新的AppDomain中。我知道我可以在Foo上添加一个方法类似

public class Foo 
{ 
    public string appDomainName 
    { 
     get { return AppDomain.CurrentDomain.FriendlyName; } 
    } 
} 

这将为我,foo是在运行应用程序域。我不认为这仅仅是一个单元测试的完美的解决方案。如果有人能够帮助定义类似的方法,那将是非常好的。编辑: 感谢您的回复和评论。我提出的问题已经得到解答,评论帮助我意识到我出错的地方。我真正想要实现的是测试一个新的AppDomain是否被创建。

回答

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比较,以你自己知道,如果它在你的域名。请注意,如果您的网域中存在(试图考虑您将自己的域中的某个对象使用透明代理的情况),则不太可能会输入if语句。

+0

有趣。我没有想到这一点。 – 2010-03-09 14:49:25

+0

我不介意一点点的探讨。这很有用。虽然如果我在一个单元测试中看到它确实有设计气味:) – btlog 2010-03-09 15:16:41

+0

@btlog - 我很好奇如何知道一个对象是否在不同的AppDomain中是一种设计气味,但是编写一个单元测试以确保它是isn (如果你明白我的意思)? – 2010-03-09 19:02:56

相关问题