加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 是否可以判断一个对象是否在另一个AppDomain中运行?

发布时间:2020-12-15 07:55:10 所属栏目:百科 来源:网络整理
导读:我想知道我是否可以告诉我们创建了一个对象appdomain.这是一个单元测试,但也是有用的常识.我有以下几段代码(这是用于说明的示例代码). public Foo Create(){ AppDomainSetup appDomainSetup = new AppDomainSet { ApplicationBase = @"z:SomePath" } AppDom
我想知道我是否可以告诉我们创建了一个对象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.

解决方法

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读