c# – 传递一个对象以接收从进程中创建的子AppDomain到Default AppDomain的回调

Sitation:我正在从我的进程创建一个子应用程序域来加载程序集.我可以调用此AppDomain.我想将一个对象从我的默认进程AppDomain传递给这个新创建的AppDomain,以接收从新AppDomain中加载的程序集到我的默认AppDoma...

Sitation:

>我正在从我的进程创建一个子应用程序域来加载程序集.
>我可以调用此AppDomain.
>我想将一个对象从我的默认进程AppDomain传递给这个新创建的AppDomain,以接收从新AppDomain中加载的程序集到我的默认AppDomain的回调.

我找到的一种方法是使用AppDomain.DoCallback方法,但不知道如何在我的孩子AppDomain中获取我的主机AppDomain?

任何机构有任何想法实现它吗?

解决方法:

一般的想法是向新创建的域传递一个派生自MarshalByRefObject类的类的实例.它将保证此对象将通过引用而不是值进行封送处理.这意味着代理将传递给新域而不是原始对象(此代理将由.NET框架为您生成).

稍后当您在此代理上调用方法时,此调用将传递回原始域(创建对象的域).换句话说,将在原始域中执行方法.

这是一个显示这个想法的代码:

public class Program
{
    private static void Main(string[] args)
    {
        var listener = new Listener();
        var otherDomain = AppDomain.CreateDomain("otherDomain");

        var instance = (Loader)otherDomain.CreateInstanceAndUnwrap(Assembly.GetExecutingAssembly().FullName, typeof(Loader).FullName);
        instance.Init(listener);
    }
}

[Serializable]
public class Loader 
    : MarshalByRefObject
{
    public void Init(Listener listener)
    {
        Console.WriteLine($"[{nameof(Init)}] Hello from {AppDomain.CurrentDomain.FriendlyName} domain");
        listener.Callback();
    }
}

[Serializable]
public class Listener 
    : MarshalByRefObject
{
    public void Callback()
    {
        Console.WriteLine($"[{nameof(Callback)}] Hello from {AppDomain.CurrentDomain.FriendlyName} domain");
    }
}

运行此代码时,您将获得以下结果:

[Init] Hello from otherDomain domain
[Callback] Hello from Sandbox.vshost.exe domain

它显示Init方法在新域中执行,但在原始域中执行回调.现在使用:MarshalByRefObject注释2行并再次运行该程序.这次Listener将按值传递到新域,结果将是:

[Init] Hello from Sandbox.vshost.exe domain
[Callback] Hello from Sandbox.vshost.exe domain

本文标题为:c# – 传递一个对象以接收从进程中创建的子AppDomain到Default AppDomain的回调

基础教程推荐