Как определить интерфейсы, которые можно использовать для приведения объекта MarshalByRefObject? - PullRequest
1 голос
/ 16 декабря 2011

Можно ли определить интерфейсы, которые можно использовать для приведения объекта MarshalByRefObject?

Как оператор приведения работает с MarshalByRefObject объектами?Вызывает ли он метод CreateObjRef?

Спасибо, Массимо

Ответы [ 2 ]

0 голосов
/ 19 декабря 2011

Вот обходной путь, который можно использовать для получения списка интерфейсов.

Определение открытого интерфейса IDescriptor

public interface IDescriptor
{
   List<string> GetInterfaces();
}

Определение базового класса, реализующего интерфейс:

public class BaseMasrhalByRefObject : MasrhalByRefObject, IDescriptor
{
   public BaseMasrhalByRefObject() : base() {}

   public List<string> GetInterfaces()
   {
      List<string> types = new List<string>();
      foreach(Type i in GetType().GetInterfaces())
      {
         types.Add(i.AssemblyQualifiedName);
      }
      return types;
   }
}

Чем использовать BaseMasrhalByRefObject вместо MasrhalByRefObject для определения объекта службы:

public class MyServiceObject : BaseMasrhalByRefObject, MyInterface1, MyInterface2, ...
{
      // Add logic method
}

В AppDomain A создайте ссылочный объект MyServiceObject.В AppDomain B получите прокси удаленного объекта.Прокси может быть приведен к IDescriptor:

public List<Type> GetInterfaces(MasrhalByRefObject proxy)
{
   List<Type> types = new List<Type>();
   IDescriptor des = proxy as IDescriptor;
   if (des != null)
   {
      foreach(string t in des.GetInterfaces()) // this is a remote call
      {
         types.Add(Type.GetType(t);
      }
   }
   return types;
}
0 голосов
/ 16 декабря 2011

MarshalByRefObject - это класс, поэтому, имея только интерфейс, вы не можете быть уверены, что все классы, реализующие его, являются производными от MarshalByRefObject. Однако, если у вас есть экземпляр объекта, вы можете легко проверить это, используя это выражение:

if (obj1 is MarshalByRefObject)
{
    // do your thing
}
...