2011-08-14 2 views
3

J'ai un objet d'exécution de type {System.Runtime.Remoting.Proxies .__ TransparentProxy} qui est créé à partir d'une instance de classe héritée de ContextBoundObject. Cette classe élève un événement vers un autre objet, j'ai besoin de convertir cet objet proxy en objet original. Tous les objets sont en mode AppDomain par défaut sur un seul système.Proxy transparent au type d'origine

public abstract class ObjectBase : ContextBoundObject, IObjectBase 
{ 
} 

public IMessageSink GetObjectSink(MarshalByRefObject o, IMessageSink next) 
     { 
      _context = (ObjectBase)o;// as ObjectBase; does not give any error but type remains 
/// transparent proxy in VS watch window. 
// no property to get the underlying type of the proxy 
      return _aspect; 
     } 

Comment les convertir en objet d'origine? Pourquoi proxy est créé si vous travaillez sur une même mémoire

Répondre

2

Vous pouvez obtenir l'instance RealProxy pour le proxy transarent en appelant MarshalServices.GetRealProxy(), mais obtenir la référence d'objet serveur est alors plus difficile, car la valeur par défaut RealProxy ne compte parmi ses membres non publiques exposant cette référence (une méthode protégée GetUnwrappedServer() et une propriété interne). Vous pouvez soit accéder à ceux-ci si le RealProxy est implémenté par vous-même ou par réflexion (si vous avez assez de confiance pour effectuer cela).

0

Vous ne devriez pas obtenir la référence réelle à un objet lié au contexte. Evan vous obtenez la référence en utilisant la réflexion/API interne, vous obtiendrez un comportement inattendu (parce que vous enfreignez les règles). Vous pouvez obtenir plus d'informations sur l'objet contextuel en utilisant google.

Je pense que vous avez un problème dans votre architecture/conception actuelle. Vous ne pouvez pas avoir un objet "agile" et "lié au contexte" en même temps. Une solution consiste à diviser votre grand objet en 2 (un contexte lié et un autre agile, et maintenez une (des) référence (s) entre eux). Ainsi, lorsque vous obtenez la référence du fichier "agile" (qui hérite de MArshallByRefObject) dans la création AppDomain, vous obtenez la référence d'objet réel, pas un proxy. (c'est la définition MarshallByRefObject)

Questions connexes