c# - CreateInstanceAndUnwrap 和域

标签 c# plugins appdomain

我有一个属性,我希望它的实例位于其他域中。

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 中加载模块。由于主应用程序还想观察模块的一些事件并与在单独域中运行的对象进行交互,实现它的最佳方法是什么。

最佳答案

如果你想在另一个程序集中实际运行代码,你需要让你的 ModuleLoader 类继承自 MarshalByRefObject .如果这样做,CreateInstanceAndUnwrap() 将实际返回一个代理,调用将在另一个应用程序域中执行。

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

关于c# - CreateInstanceAndUnwrap 和域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7044971/

相关文章:

c# - IP 端点 0.0.0.0 :13000. 上已经有一个监听器 ?? (使用 WCF 的 TCP)

c# - ASP.NET MVC 和实体 - 使用原始 SQL 时加载导航属性/对象

c# - 我需要在项目中获取文件夹路径

c - 如何使用GStreamer的电平插件获取特定音频文件的峰值和均方根值

c# - 如何无异常(exception)地指示失败的操作(多个应用程序域)?

c# - 如何为可为空的 bool 值读取 null

ruby-on-rails - 如何在插件的 before_save 回调中包含实例方法?

php - 如何从 foreach 数组循环中构造手动自定义字段?

.NET AppDomain 混淆

c# - 在新 AppDomain 中加载程序集而不在父 AppDomain 中加载它