地点:
- 我正在从我的进程创建一个子应用程序域来加载程序集。
- 我能够调用此 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 方法是在新域中执行的,但回调是在原始域中执行的。现在注释 2 行: MarshalByRefObject
并再次运行该程序。这次Listener
将按值传递到新域,结果将是:
[Init] Hello from Sandbox.vshost.exe domain
[Callback] Hello from Sandbox.vshost.exe domain
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)