다음을 통해 공유


RealProxy 클래스

프록시의 기본 기능을 제공합니다.

네임스페이스: System.Runtime.Remoting.Proxies
어셈블리: mscorlib(mscorlib.dll)

구문

‘선언
<ComVisibleAttribute(True)> _
Public MustInherit Class RealProxy
‘사용 방법
Dim instance As RealProxy
[ComVisibleAttribute(true)] 
public abstract class RealProxy
[ComVisibleAttribute(true)] 
public ref class RealProxy abstract
/** @attribute ComVisibleAttribute(true) */ 
public abstract class RealProxy
ComVisibleAttribute(true) 
public abstract class RealProxy

설명

RealProxy 클래스는 프록시가 파생되어야 하는 abstract 기본 클래스입니다.

모든 종류의 원격 경계에서 개체를 사용하는 클라이언트는 실제로 해당 개체의 투명 프록시를 사용하고 있는 것입니다. 투명 프록시는 실체 개체가 클라이언트의 공간에 있는 것처럼 보이게 합니다. 이는 프록시가 자신에 대한 호출을 원격 인프라를 사용하여 실제 개체로 전달하기 때문에 가능합니다.

투명 프록시는 RealProxy 형식의 관리되는 런타임 클래스 인스턴스에 의해 자체 지원됩니다. RealProxy는 투명 프록시로부터 작업을 전달하는 데 필요한 기능 중 일부를 구현합니다. 프록시 개체는 가비지 수집 같은 관리되는 개체의 관련 의미 및 필드와 메서드 지원을 상속하며 새 클래스를 만들기 위해 확장될 수 있습니다. 프록시는 두 가지 특성이 있습니다. 원격 개체(투명 개체)와 클래스가 같은 개체 역할을 하고 관리되는 개체 자체이기도 합니다.

프록시 개체는 AppDomain 내의 원격 하위 영역에 관계없이 사용될 수 있습니다.

참고

이 클래스는 클래스 수준에 링크 요청과 상속 요청을 만듭니다. 직접 실행 호출자나 파생 클래스에 인프라 권한이 없으면 SecurityException이 throw됩니다. 보안 요청에 대한 자세한 내용은 링크 요청상속 요청을 참조하십시오.

상속자 참고 사항 RealProxy에서 상속할 때 Invoke 메서드를 재정의해야 합니다.

예제

' Create a custom 'RealProxy'.
Public Class MyProxy
   Inherits RealProxy
   Private myURIString As String
   Private myMarshalByRefObject As MarshalByRefObject

   <PermissionSet(SecurityAction.LinkDemand)> _
   Public Sub New(ByVal myType As Type)
      MyBase.New(myType)
      ' RealProxy uses the Type to generate a transparent proxy.
      myMarshalByRefObject = CType(Activator.CreateInstance(myType), MarshalByRefObject)
      ' Get 'ObjRef', for transmission serialization between application domains.
      Dim myObjRef As ObjRef = RemotingServices.Marshal(myMarshalByRefObject)
      ' Get the 'URI' property of 'ObjRef' and store it.
      myURIString = myObjRef.URI
      Console.WriteLine("URI :{0}", myObjRef.URI)
   End Sub 'New

<SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags:=SecurityPermissionFlag.Infrastructure)> _
   Public Overrides Function Invoke(ByVal myIMessage As IMessage) As IMessage
      Console.WriteLine("MyProxy.Invoke Start")
      Console.WriteLine("")

      If TypeOf myIMessage Is IMethodCallMessage Then
         Console.WriteLine("IMethodCallMessage")
      End If
      If TypeOf myIMessage Is IMethodReturnMessage Then
         Console.WriteLine("IMethodReturnMessage")
      End If
      Dim msgType As Type
      msgType = CObj(myIMessage).GetType
      Console.WriteLine("Message Type: {0}", msgType.ToString())
      Console.WriteLine("Message Properties")
      Dim myIDictionary As IDictionary = myIMessage.Properties
      ' Set the '__Uri' property of 'IMessage' to 'URI' property of 'ObjRef'.
      myIDictionary("__Uri") = myURIString
      Dim myIDictionaryEnumerator As IDictionaryEnumerator = CType(myIDictionary.GetEnumerator(), _
                                                                    IDictionaryEnumerator)

      While myIDictionaryEnumerator.MoveNext()
         Dim myKey As Object = myIDictionaryEnumerator.Key
         Dim myKeyName As String = myKey.ToString()
         Dim myValue As Object = myIDictionaryEnumerator.Value

         Console.WriteLine(ControlChars.Tab + "{0} : {1}", myKeyName, myIDictionaryEnumerator.Value)
         If myKeyName = "__Args" Then
            Dim myObjectArray As Object() = CType(myValue, Object())
            Dim aIndex As Integer
            For aIndex = 0 To myObjectArray.Length - 1
               Console.WriteLine(ControlChars.Tab + ControlChars.Tab + "arg: {0} myValue: {1}", _
                                                              aIndex, myObjectArray(aIndex))
             Next aIndex
         End If

         If myKeyName = "__MethodSignature" And Not Nothing Is myValue Then
            Dim myObjectArray As Object() = CType(myValue, Object())
            Dim aIndex As Integer
            For aIndex = 0 To myObjectArray.Length - 1
               Console.WriteLine(ControlChars.Tab + ControlChars.Tab + "arg: {0} myValue: {1}", _
                                                           aIndex, myObjectArray(aIndex))
            Next aIndex
         End If
      End While

        Dim myReturnMessage As IMessage

        myIDictionary("__Uri") = myURIString
        Console.WriteLine("__Uri {0}", myIDictionary("__Uri"))

        Console.WriteLine("ChannelServices.SyncDispatchMessage")
        myReturnMessage = ChannelServices.SyncDispatchMessage(CObj(myIMessage))

        ' Push return value and OUT parameters back onto stack.
        Dim myMethodReturnMessage As IMethodReturnMessage = CType(myReturnMessage, IMethodReturnMessage)
        Console.WriteLine("IMethodReturnMessage.ReturnValue: {0}", myMethodReturnMessage.ReturnValue)

        Console.WriteLine("MyProxy.Invoke - Finish")

        Return myReturnMessage
    End Function 'Invoke
End Class 'MyProxy
// Create a custom 'RealProxy'.
public class MyProxy : RealProxy
{
   String myURIString;
   MarshalByRefObject myMarshalByRefObject;   

   [PermissionSet(SecurityAction.LinkDemand)]
   public MyProxy(Type myType) : base(myType)
   {
      // RealProxy uses the Type to generate a transparent proxy.
      myMarshalByRefObject = (MarshalByRefObject)Activator.CreateInstance((myType));
      // Get 'ObjRef', for transmission serialization between application domains.
      ObjRef myObjRef = RemotingServices.Marshal(myMarshalByRefObject);
      // Get the 'URI' property of 'ObjRef' and store it.
      myURIString = myObjRef.URI;
      Console.WriteLine("URI :{0}", myObjRef.URI);
   }

   [SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags=SecurityPermissionFlag.Infrastructure)]
   public override IMessage Invoke(IMessage myIMessage)
   {
      Console.WriteLine("MyProxy.Invoke Start");
      Console.WriteLine("");

      if (myIMessage is IMethodCallMessage)
         Console.WriteLine("IMethodCallMessage");

      if (myIMessage is IMethodReturnMessage)
         Console.WriteLine("IMethodReturnMessage");

      Type msgType = myIMessage.GetType();
      Console.WriteLine("Message Type: {0}", msgType.ToString());
      Console.WriteLine("Message Properties");
      IDictionary myIDictionary = myIMessage.Properties;
      // Set the '__Uri' property of 'IMessage' to 'URI' property of 'ObjRef'.
      myIDictionary["__Uri"] = myURIString;
      IDictionaryEnumerator myIDictionaryEnumerator = 
         (IDictionaryEnumerator) myIDictionary.GetEnumerator();

      while (myIDictionaryEnumerator.MoveNext())
      {
         Object myKey = myIDictionaryEnumerator.Key;
         String myKeyName = myKey.ToString();
         Object myValue = myIDictionaryEnumerator.Value;

         Console.WriteLine("\t{0} : {1}", myKeyName, 
            myIDictionaryEnumerator.Value);
         if (myKeyName == "__Args")
         {
            Object[] myObjectArray = (Object[])myValue;
            for (int aIndex = 0; aIndex < myObjectArray.Length; aIndex++)
               Console.WriteLine("\t\targ: {0} myValue: {1}", aIndex, 
                  myObjectArray[aIndex]);
         }

         if ((myKeyName == "__MethodSignature") && (null != myValue))
         {
            Object[] myObjectArray = (Object[])myValue;
            for (int aIndex = 0; aIndex < myObjectArray.Length; aIndex++)
               Console.WriteLine("\t\targ: {0} myValue: {1}", aIndex, 
                  myObjectArray[aIndex]);
         }
      }
      
      IMessage myReturnMessage;

      myIDictionary["__Uri"] = myURIString;
      Console.WriteLine("__Uri {0}", myIDictionary["__Uri"]);

      Console.WriteLine("ChannelServices.SyncDispatchMessage");
      myReturnMessage = ChannelServices.SyncDispatchMessage(myIMessage);

      // Push return value and OUT parameters back onto stack.

      IMethodReturnMessage myMethodReturnMessage = (IMethodReturnMessage)
         myReturnMessage;
      Console.WriteLine("IMethodReturnMessage.ReturnValue: {0}", 
         myMethodReturnMessage.ReturnValue);

      Console.WriteLine("MyProxy.Invoke - Finish");

      return myReturnMessage;
   }
}
// Create a custom 'RealProxy'.
/** @attribute SecurityPermission(SecurityAction.Demand, Flags = SecurityPermissionFlag.Infrastructure) */
public class MyProxy extends RealProxy
{
    private String myURIString;
    private MarshalByRefObject myMarshalByRefObject;

    public MyProxy(Type myType)
    {
        super(myType);

        // RealProxy uses the Type to generate a transparent proxy.
        myMarshalByRefObject = 
            (MarshalByRefObject)(Activator.CreateInstance(myType));

        // Get 'ObjRef', for transmission serialization between 
        // application domains.
        ObjRef myObjRef = RemotingServices.Marshal(myMarshalByRefObject);

        // Get the 'URI' property of 'ObjRef' and store it.
        myURIString = myObjRef.get_URI();
        Console.WriteLine("URI :{0}", myObjRef.get_URI());
    } //MyProxy

    public IMessage Invoke(IMessage myIMessage)
    {
        Console.WriteLine("MyProxy.Invoke Start");
        Console.WriteLine("");
        if (myIMessage instanceof IMethodCallMessage) {
            Console.WriteLine("IMethodCallMessage");
        }

        if (myIMessage instanceof IMethodReturnMessage) {
            Console.WriteLine("IMethodReturnMessage");
        }

        Type msgType = myIMessage.GetType();

        Console.WriteLine("Message Type: {0}", msgType.ToString());
        Console.WriteLine("Message Properties");

        IDictionary myIDictionary = myIMessage.get_Properties();

        // Set the '__Uri' property of 'IMessage' to 'URI' property of 'ObjRef'.
        myIDictionary.set_Item("__Uri", myURIString);

        IDictionaryEnumerator myIDictionaryEnumerator = 
            (IDictionaryEnumerator)(myIDictionary.GetEnumerator());
        while (myIDictionaryEnumerator.MoveNext()) {
            Object myKey = myIDictionaryEnumerator.get_Key();
            String myKeyName = myKey.ToString();
            Object myValue = myIDictionaryEnumerator.get_Value();
            Console.WriteLine("\t{0} : {1}", myKeyName, 
                myIDictionaryEnumerator.get_Value());

            if (myKeyName.Equals("__Args")) {
                Object myObjectArray[] = (Object[])myValue;
                for (int aIndex = 0; aIndex < myObjectArray.length; aIndex++) {
                    Console.WriteLine("\t\targ: {0} myValue: {1}", 
                        (Int32)aIndex, myObjectArray.get_Item(aIndex));
                }
            }

            if (myKeyName.Equals("__MethodSignature") && null != myValue) {
                Object myObjectArray[] = (Object[])myValue;
                for (int aIndex = 0; aIndex < myObjectArray.length; aIndex++) {
                    Console.WriteLine("\t\targ: {0} myValue: {1}", 
                        (Int32)aIndex, myObjectArray.get_Item(aIndex));
                }
            }
        }

        IMessage myReturnMessage;
        myIDictionary.set_Item("__Uri", myURIString);
        Console.WriteLine("__Uri {0}", myIDictionary.get_Item("__Uri"));
        Console.WriteLine("ChannelServices.SyncDispatchMessage");
        myReturnMessage = ChannelServices.SyncDispatchMessage(myIMessage);

        // Push return value and OUT parameters back onto stack.
        IMethodReturnMessage myMethodReturnMessage = 
            (IMethodReturnMessage)myReturnMessage;
        Console.WriteLine("IMethodReturnMessage.ReturnValue: {0}", 
            myMethodReturnMessage.get_ReturnValue());
        Console.WriteLine("MyProxy.Invoke - Finish");
        return myReturnMessage;
    } //Invoke
} //MyProxy

.NET Framework 보안

상속 계층 구조

System.Object
  System.Runtime.Remoting.Proxies.RealProxy

스레드로부터의 안전성

이 형식의 모든 public static(Visual Basic의 경우 Shared) 멤버는 스레드로부터 안전합니다. 인터페이스 멤버는 스레드로부터 안전하지 않습니다.

플랫폼

Windows 98, Windows 2000 SP4, Windows Millennium Edition, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition

.NET Framework에서 모든 플래폼의 모든 버전을 지원하지는 않습니다. 지원되는 버전의 목록은 시스템 요구 사항을 참조하십시오.

버전 정보

.NET Framework

2.0, 1.1, 1.0에서 지원

참고 항목

참조

RealProxy 멤버
System.Runtime.Remoting.Proxies 네임스페이스