CreateInstanceAndUnwrap and Domain

本文关键字:Domain and CreateInstanceAndUnwrap | 更新日期: 2023-09-27 18:05:19

我有一个属性,我想把它的实例放在其他域中。

public ModuleLoader Loader
        {
            get
            {
                if(_loader == null)
                    _loader = (ModuleLoader)myDomain.CreateInstanceAndUnwrap(
                              this.GetType().Assembly.FullName,
                              "ModuleLoader",
                              false, 
                              System.Reflection.BindingFlags.CreateInstance,                                  
                              null, 
                              null, 
                              null, 
                              null);
                System.Diagnostics.Debug.WriteLine("Is proxy={0}",
                             RemotingServices.IsTransparentProxy(_loader)); 
                                 //writes false
                 _loader.Session = this;
                 return _loader;
            }
        }

这很好。但是我假设_loader实例上的所有方法调用都将在其他域(myDomain)中调用。但是当我运行下面的代码时,它仍然写主应用程序域。

public void LoadModule(string moduleAssembly)
        {
            System.Diagnostics.Debug.WriteLine("Is proxy={0}", 
                     RemotingServices.IsTransparentProxy(this));
            System.Diagnostics.Debug.WriteLine(
                          AppDomain.CurrentDomain.FriendlyName);
            System.Diagnostics.Debug.WriteLine("-----------");
        }

是因为Unwrap()吗?我哪里做错了?

我知道AppDomain创建了单独的内存。我需要的是我的主要应用程序运行,它在不同的AppDomain加载模块。由于主应用程序也想要观察模块的一些活动,并与运行在不同领域的对象进行交互,实现它的最佳方法是什么?

CreateInstanceAndUnwrap and Domain

如果您想在其他程序集中实际运行代码,则需要使ModuleLoader类继承MarshalByRefObject。如果你这样做,CreateInstanceAndUnwrap()实际上会返回一个代理,调用将在另一个appdomain执行。

如果您不这样做,而是将类标记为Serializable(如异常消息所示),CreateInstanceAndUnwrap()将在另一个appdomain中创建对象,序列化它,将序列化的形式转移到原始appdomain,在那里反序列化并调用反序列化实例上的方法。