如何获得父母的AppDomain? [英] How to get parent AppDomain?

查看:288
本文介绍了如何获得父母的AppDomain?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要做这样的事情在C#(伪):

I need to do something like this in c# (pseudo):

static var ns = new Non_Serializable_Nor_Marshal()

var app = new AppDomain();
app.execute(foo)

void foo()
{
    var host = AppDomain.Current.Parent; //e.g. the original one
    host.execute(bar)
}

void bar()
{
    ns.Something();
}



IOW我有一个AppDomain的非可序列化,也不元帅对象。
我想创建一个第二个域和执行foo的()。从第二域内我想在原来的域中执行杆()。

IOW I have a non serializeable nor marshal object in one appdomain. I want to create a second domain and execute foo(). From within that second domain I want to execute bar() on the original domain.

我如何通过原始域给孩子吗?

How do I pass the original domain to the child one?

推荐答案

如果您不想使用互操作,还可以使用AppDomainManager使用一个小把戏。你基本上可以自动'线'的'主'域到任何域自动 - albiet的方式我这样做就意味着你放弃你的真实的主域

If you don't want to use interop, you can also use a little trick using AppDomainManager. You can basically automatically 'wire' the 'primary' domain into any domains automatically - albiet the way I do it means you discard your real primary domain.

下面是类做所有魔法:

/// <summary>
/// Represents a <see cref="AppDomainManager"/> that is
/// aware of the primary application AppDomain.
/// </summary>
public class PrimaryAppDomainManager : AppDomainManager
{
    private static AppDomain _primaryDomain;

    /// <summary>
    /// Gets the primary domain.
    /// </summary>
    /// <value>The primary domain.</value>
    public static AppDomain PrimaryDomain
    {
        get
        {
            return _primaryDomain;
        }
    }

    /// <summary>
    /// Sets the primary domain.
    /// </summary>
    /// <param name="primaryDomain">The primary domain.</param>
    private void SetPrimaryDomain(AppDomain primaryDomain)
    {
        _primaryDomain = primaryDomain;
    }

    /// <summary>
    /// Sets the primary domain to self.
    /// </summary>
    private void SetPrimaryDomainToSelf()
    {
        _primaryDomain = AppDomain.CurrentDomain;
    }

    /// <summary>
    /// Determines whether this is the primary domain.
    /// </summary>
    /// <value>
    ///     <see langword="true"/> if this instance is the primary domain; otherwise, <see langword="false"/>.
    /// </value>
    public static bool IsPrimaryDomain
    {
        get
        {
            return _primaryDomain == AppDomain.CurrentDomain;
        }
    }

    /// <summary>
    /// Creates the initial domain.
    /// </summary>
    /// <param name="friendlyName">Name of the friendly.</param>
    /// <param name="securityInfo">The security info.</param>
    /// <param name="appDomainInfo">The AppDomain setup info.</param>
    /// <returns></returns>
    public static AppDomain CreateInitialDomain(string friendlyName, Evidence securityInfo, AppDomainSetup appDomainInfo)
    {
        if (AppDomain.CurrentDomain.DomainManager is PrimaryAppDomainManager)
            return null;

        appDomainInfo = appDomainInfo ?? new AppDomainSetup();
        appDomainInfo.AppDomainManagerAssembly = typeof(PrimaryAppDomainManager).Assembly.FullName;
        appDomainInfo.AppDomainManagerType = typeof(PrimaryAppDomainManager).FullName;

        var appDomain = AppDomainManager.CreateDomainHelper(friendlyName, securityInfo, appDomainInfo);
        ((PrimaryAppDomainManager)appDomain.DomainManager).SetPrimaryDomainToSelf();
        _primaryDomain = appDomain;
        return appDomain;
    }

    /// <summary>
    /// Returns a new or existing application domain.
    /// </summary>
    /// <param name="friendlyName">The friendly name of the domain.</param>
    /// <param name="securityInfo">An object that contains evidence mapped through the security policy to establish a top-of-stack permission set.</param>
    /// <param name="appDomainInfo">An object that contains application domain initialization information.</param>
    /// <returns>A new or existing application domain.</returns>
    /// <PermissionSet>
    ///     <IPermission class="System.Security.Permissions.SecurityPermission, mscorlib, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" version="1" Flags="ControlEvidence, ControlAppDomain, Infrastructure"/>
    /// </PermissionSet>
    public override AppDomain CreateDomain(string friendlyName, Evidence securityInfo, AppDomainSetup appDomainInfo)
    {
        appDomainInfo = appDomainInfo ?? new AppDomainSetup();
        appDomainInfo.AppDomainManagerAssembly = typeof(PrimaryAppDomainManager).Assembly.FullName;
        appDomainInfo.AppDomainManagerType = typeof(PrimaryAppDomainManager).FullName;

        var appDomain = base.CreateDomain(friendlyName, securityInfo, appDomainInfo);
        ((PrimaryAppDomainManager)appDomain.DomainManager).SetPrimaryDomain(_primaryDomain);

        return appDomain;
    }
}

和你需要改变你的主()(应用程序入口)略:

And you need to alter your Main() (application entry) slightly:

/// <summary>
/// The main entry point for the application.
/// </summary>
static void Main(string[] args)
{
    new Program().Run(args);
}

void Run(string[] args)
{
    var domain = PrimaryAppDomainManager.CreateInitialDomain("PrimaryDomain", null, null);
    if (domain == null)
    {
        // Original Main() code here.
    }
    else
    {
        domain.CreateInstanceAndUnwrap<Program>().Run(args);
    }
}

现在在任何时候,你可以得到 PrimaryAppDomainManager.PrimaryDomain 去主域的引用,只记得它是不是由.NET运行时创建的inital域 - 这是一个大家立即创建

Now at any point you can get PrimaryAppDomainManager.PrimaryDomain to get a reference to the primary domain, just remember that it isn't the inital domain created by the .Net runtime - it's one we create immediately.

您可以看看我的博客文章一个办法让.NET运行时钩在这个自动为您使用的app.config。

You can look at the comments in my blog post for an way to get the .Net runtime to hook this in for you automatically using the app.config.

编辑:我忘了补充我用的是扩展方法,那就是:

I forgot to add the extension method I use, here it is:

/// <summary>
/// Creates a new instance of the specified type.
/// </summary>
/// <typeparam name="T">The type of object to create.</typeparam>
/// <param name="appDomain">The app domain.</param>
/// <returns>A proxy for the new object.</returns>
public static T CreateInstanceAndUnwrap<T>(this AppDomain appDomain)
{
    var res = (T)appDomain.CreateInstanceAndUnwrap(typeof(T));
    return res;
}

这篇关于如何获得父母的AppDomain?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆