CreateInstanceAndUnwrap и домен - PullRequest
       25

CreateInstanceAndUnwrap и домен

9 голосов
/ 12 августа 2011

У меня есть свойство, экземпляр которого я хочу разместить в другом домене.

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.Поскольку основное приложение также хочет наблюдать за некоторой активностью модулей и взаимодействием с объектами, работающими в отдельной области, каков наилучший способ достичь этого.

1 Ответ

33 голосов
/ 13 августа 2011

Если вы действительно хотите запустить код в другой сборке, вам нужно сделать так, чтобы ваш ModuleLoader класс наследовал от MarshalByRefObject. Если вы сделаете это, CreateInstanceAndUnwrap() фактически вернет прокси, и вызов будет выполнен в другом домене приложения.

Если вы этого не сделаете и вместо этого отметите класс как Serializable (как подсказывает сообщение об исключении), CreateInstanceAndUnwrap() создаст объект в другом домене приложения, сериализует его, передаст сериализованную форму в исходный appdomain, десериализуйте его там и вызовите метод на десериализованном экземпляре.

...