Sitation:我正在从我的进程创建一个子应用程序域来加载程序集.我可以调用此AppDomain.我想将一个对象从我的默认进程AppDomain传递给这个新创建的AppDomain,以接收从新AppDomain中加载的程序集到我的默认AppDoma...
![](https://oss.womengda.net/imgfile/2309/1E39A13351T0-2b64.jpg)
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的回调
![](/xwassets/images/pre.png)
![](/xwassets/images/next.png)
- user32.dll 函数说明小结 2022-12-26
- Unity Shader实现模糊效果 2023-04-27
- c# 模拟线性回归的示例 2023-03-14
- WPF使用DrawingContext实现绘制刻度条 2023-07-04
- 在C# 8中如何使用默认接口方法详解 2023-03-29
- .NET CORE DI 依赖注入 2023-09-27
- 如何使用C# 捕获进程输出 2023-03-10
- Oracle中for循环的使用方法 2023-07-04
- Unity3D实现渐变颜色效果 2023-01-16
- C# 使用Aspose.Cells 导出Excel的步骤及问题记录 2023-05-16