c# - 将一个对象传递给 Default AppDomain,以从进程中创建的子 AppDomain 接收回调

标签 c# ipc appdomain

坐:

  1. 我正在从我的进程中创建子应用程序域以加载程序集。
  2. 我可以调用此 AppDomain。
  3. 我想将一个对象从我的默认进程 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# - 将一个对象传递给 Default AppDomain,以从进程中创建的子 AppDomain 接收回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35772869/

相关文章:

javascript - C# webbrowser 控件 - google map javascript 问题

c# - 在调用基本构造函数和辅助方法时使用类属性

linux - 如何监控 FIFO?

c - 共享内存的访问控制不起作用?

asp.net - 每当重新加载应用程序域时,您如何强制 IIS 应用程序池重新启动?

c# - 从字节数组加载时找不到 AppDomain 程序集

c# - 如何从不同线程更新ASP.NET Web表单?

c# - 快速计算传入数字的最小值、最大值和平均值

c++ - 共享内存中的 vector 结构

c# - Type.IsSubclassOf 的行为不符合预期