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的回调
基础教程推荐
- C# List实现行转列的通用方案 2022-11-02
- C# 调用WebService的方法 2023-03-09
- C#类和结构详解 2023-05-30
- 一个读写csv文件的C#类 2022-11-06
- C#控制台实现飞行棋小游戏 2023-04-22
- linux – 如何在Debian Jessie中安装dotnet core sdk 2023-09-26
- ZooKeeper的安装及部署教程 2023-01-22
- C# windows语音识别与朗读实例 2023-04-27
- unity实现动态排行榜 2023-04-27
- winform把Office转成PDF文件 2023-06-14