4
我有两个应用程序域,一个父域创建子域。在子域中,有一个MarshalByRef
对象,使用.NET Remoting进行通信。在父域中运行的对象调用的远程对象的包装器作为应用程序的功能的一部分:如何在应用程序域之间传递事件?
public class ScanningTask : Task
{
private class Loader : MarshalByRef
{
public void Load(IEnumerable<string> paths)
{
...
}
public event EventHandler<LoadEventArgs> OnLoad;
}
public void RunTask()
{
var domain = AppDomain.CreateDomain("LoadDomain");
var loader = (Loader)domain.CreateInstanceFromAndUnwrap(
typeof(Loader).Assembly.Location,
typeof(Loader).FullName);
loader.Load(...);
AppDomain.Unload(domain);
}
}
为简洁移除大多数代码。
This Loader
object exposed an OnLoad
event我想在父域中捕获。如果我只是添加一个事件处理程序委托,它会尝试将ScanningTask
序列化到子域中,并引发关于它不可序列化的异常。
我真正想要的是事件在域之间传递。有什么聪明的建议如何?
包装的任务工作作为一种解决方案,它工作得很好。尽管我确实遇到了解决依赖关系的问题;检查AppDomain.AssemblyResolve事件,如果你得到奇怪的,无法解释的错误! – 2011-05-04 10:28:31
创建AppDomain时,传入AppDomainSetup的实例以配置您需要的任何程序集解析自定义。 我相信在上面的场景中,您的新AppDomain将基于当前可执行文件所在的目录。因此,如果你的动态加载的DLL不在同一个目录下,你会得到加载器错误。 因此,请记住将AppDomainSetup对象的ApplicationBase路径设置为包含所有必需依赖项的位置。 – Adam 2011-05-09 04:43:16
- 记住,注册一个事件会导致'动态加载的dll'尝试加载'订阅dll',所以这两个dll必须可以在子AppDomain中解决。 – Adam 2011-05-09 04:48:12