RealProxy Klasse
Definition
Wichtig
Einige Informationen beziehen sich auf Vorabversionen, die vor dem Release ggf. grundlegend überarbeitet werden. Microsoft übernimmt hinsichtlich der hier bereitgestellten Informationen keine Gewährleistungen, seien sie ausdrücklich oder konkludent.
Stellt die Basisfunktionen für Proxys bereit.
public ref class RealProxy abstract
public abstract class RealProxy
[System.Runtime.InteropServices.ComVisible(true)]
public abstract class RealProxy
[System.Runtime.InteropServices.ComVisible(true)]
[System.Security.SecurityCritical]
public abstract class RealProxy
type RealProxy = class
[<System.Runtime.InteropServices.ComVisible(true)>]
type RealProxy = class
[<System.Runtime.InteropServices.ComVisible(true)>]
[<System.Security.SecurityCritical>]
type RealProxy = class
Public MustInherit Class RealProxy
- Vererbung
-
RealProxy
- Attribute
Beispiele
// Create a custom 'RealProxy'.
public ref class MyProxy: public RealProxy
{
private:
String^ myURIString;
MarshalByRefObject^ myMarshalByRefObject;
public:
MyProxy( Type^ myType )
: RealProxy( myType )
{
// RealProxy uses the Type to generate a transparent proxy.
myMarshalByRefObject = dynamic_cast<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 );
}
virtual IMessage^ Invoke ( IMessage^ myIMessage ) override
{
Console::WriteLine( "MyProxy.Invoke Start" );
Console::WriteLine( "" );
if ( dynamic_cast<IMethodCallMessage^>(myIMessage) )
Console::WriteLine( "IMethodCallMessage" );
if ( dynamic_cast<IMethodReturnMessage^>(myIMessage) )
Console::WriteLine( "IMethodReturnMessage" );
Type^ msgType = myIMessage->GetType();
Console::WriteLine( "Message Type: {0}", msgType );
Console::WriteLine( "Message Properties" );
IDictionary^ myIDictionary = myIMessage->Properties;
// Set the '__Uri' property of 'IMessage' to 'URI' property of 'ObjRef'.
myIDictionary->default[ "__Uri" ] = myURIString;
IDictionaryEnumerator^ myIDictionaryEnumerator = dynamic_cast<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->Equals( "__Args" ) )
{
array<Object^>^myObjectArray = (array<Object^>^)myValue;
for ( int aIndex = 0; aIndex < myObjectArray->Length; aIndex++ )
Console::WriteLine( "\t\targ: {0} myValue: {1}", aIndex, myObjectArray[ aIndex ] );
}
if ( (myKeyName->Equals( "__MethodSignature" )) && (nullptr != myValue) )
{
array<Object^>^myObjectArray = (array<Object^>^)myValue;
for ( int aIndex = 0; aIndex < myObjectArray->Length; aIndex++ )
Console::WriteLine( "\t\targ: {0} myValue: {1}", aIndex, myObjectArray[ aIndex ] );
}
}
IMessage^ myReturnMessage;
myIDictionary->default[ "__Uri" ] = myURIString;
Console::WriteLine( "__Uri {0}", myIDictionary->default[ "__Uri" ] );
Console::WriteLine( "ChannelServices.SyncDispatchMessage" );
myReturnMessage = ChannelServices::SyncDispatchMessage( myIMessage );
// Push return value and OUT parameters back onto stack.
IMethodReturnMessage^ myMethodReturnMessage = dynamic_cast<IMethodReturnMessage^>(myReturnMessage);
Console::WriteLine( "IMethodReturnMessage.ReturnValue: {0}", myMethodReturnMessage->ReturnValue );
Console::WriteLine( "MyProxy.Invoke - Finish" );
return myReturnMessage;
}
};
// Create a custom 'RealProxy'.
public class MyProxy : RealProxy
{
String myURIString;
MarshalByRefObject myMarshalByRefObject;
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);
}
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'.
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
<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
Hinweise
Die RealProxy -Klasse ist die abstract
Basisklasse, von der Proxys abgeleitet werden müssen.
Ein Client, der ein Objekt über eine beliebige Remotinggrenze hinweg verwendet, verwendet tatsächlich einen transparenten Proxy für das Objekt. Der transparente Proxy bietet die Illusion, dass sich das tatsächliche Objekt im Clientbereich befindet. Dies wird erreicht, indem Aufrufe an das reale Objekt mithilfe der Remotinginfrastruktur weitergeleitet werden.
Der transparente Proxy ist selbst in einer Instanz einer verwalteten Laufzeitklasse vom Typ RealProxyuntergebracht. RealProxy Implementiert einen Teil der Funktionalität, die erforderlich ist, um die Vorgänge vom transparenten Proxy weiterzuleiten. Beachten Sie, dass ein Proxyobjekt die zugeordnete Semantik verwalteter Objekte erbt, z. B. Garbage Collection, Unterstützung für Felder und Methoden, und kann erweitert werden, um neue Klassen zu bilden. Der Proxy hat einen dualen Charakter: Er fungiert als Objekt derselben Klasse wie das Remoteobjekt (transparenter Proxy), und es handelt sich um ein verwaltetes Objekt selbst.
Ein Proxyobjekt kann ohne Rücksicht auf Remotingunterteilungen innerhalb eines AppDomainverwendet werden.
Hinweis
Diese Klasse stellt eine Linkanforderung und eine Vererbungsanforderung auf Klassenebene her. Ein SecurityException wird ausgelöst, wenn entweder der unmittelbare Aufrufer oder die abgeleitete Klasse über keine Infrastrukturberechtigung verfügt. Ausführliche Informationen zu Sicherheitsanforderungen finden Sie unter Linkanforderungen und Vererbungsanforderungen.
Hinweise für Ausführende
Wenn Sie von erben RealProxy, müssen Sie die Invoke(IMessage) -Methode überschreiben.
Konstruktoren
RealProxy() |
Initialisiert eine neue Instanz der RealProxy-Klasse mit Standardwerten. |
RealProxy(Type) |
Initialisiert eine neue Instanz der RealProxy-Klasse, die ein Remoteobjekt des angegebenen Type darstellt. |
RealProxy(Type, IntPtr, Object) |
Initialisiert eine neue Instanz der RealProxy-Klasse. |
Methoden
AttachServer(MarshalByRefObject) |
Fügt die aktuelle Proxyinstanz an das angegebenen Remote-MarshalByRefObject an. |
CreateObjRef(Type) |
Erstellt ein ObjRef für den angegebenen Objekttyp und registriert dieses bei der Remoteinfrastruktur als vom Client aktiviertes Objekt. |
DetachServer() |
Trennt die aktuelle Proxyinstanz von dem Remoteserverobjekt, das sie darstellt. |
Equals(Object) |
Bestimmt, ob das angegebene Objekt gleich dem aktuellen Objekt ist. (Geerbt von Object) |
GetCOMIUnknown(Boolean) |
Fordert einen nicht verwalteten Verweis auf das Objekt an, das durch die aktuelle Proxyinstanz dargestellt wird. |
GetHashCode() |
Fungiert als Standardhashfunktion. (Geerbt von Object) |
GetObjectData(SerializationInfo, StreamingContext) |
Fügt der angegebenen RealProxy den transparenten Proxy hinzu, der durch die aktuelle Instanz von SerializationInfo dargestellt wird. |
GetProxiedType() |
Gibt den Type des Objekts zurück, das von der aktuellen Instanz des RealProxy dargestellt wird. |
GetStubData(RealProxy) |
Ruft die für den angegebenen Proxy gespeicherten Stubdaten ab. |
GetTransparentProxy() |
Gibt den transparenten Proxy für die aktuelle Instanz von RealProxy zurück. |
GetType() |
Ruft den Type der aktuellen Instanz ab. (Geerbt von Object) |
GetUnwrappedServer() |
Gibt das von der aktuellen Proxyinstanz dargestellte Serverobjekt zurück. |
InitializeServerObject(IConstructionCallMessage) |
Initialisiert eine neue Instanz des Objekt-Type des Remoteobjekts, das die aktuelle Instanz des RealProxy darstellt, mit der angegebenen IConstructionCallMessage. |
Invoke(IMessage) |
Ruft beim Überschreiben in einer abgeleiteten Klasse die Methode auf, die in der bereitgestellten IMessage für das durch die aktuelle Instanz dargestellte Remoteobjekt angegeben ist. |
MemberwiseClone() |
Erstellt eine flache Kopie des aktuellen Object. (Geerbt von Object) |
SetCOMIUnknown(IntPtr) |
Speichert einen nicht verwalteten Proxy des Objekts, das von der aktuellen Instanz dargestellt wird. |
SetStubData(RealProxy, Object) |
Legt die Stubdaten für den angegebenen Proxy fest. |
SupportsInterface(Guid) |
Fordert eine COM-Schnittstelle mit der angegebenen ID an. |
ToString() |
Gibt eine Zeichenfolge zurück, die das aktuelle Objekt darstellt. (Geerbt von Object) |